Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C] Chiamata di Funzione all'interno di un Case

    Ciao a tutti,
    anche se so di essere in ritardo mi sto avviciando al linguaggio C,
    vi espengo un problema che per voi sarà semplicissimo però voglio capire perchè il codice che ho scritto non funziona come dovrebbe:

    codice:
    #include <stdio.h>  
    void Saluta();  
    int main() {     
    int comando = 0;      
    printf("Comandi Disponibili:\n");     
    printf("1 - Saluta\n");     
    printf("2 - ???\n");     
    printf("3 - ???\n");     
    printf("Inserisci il Numero del comando: ");     
    scanf("%d", &comando);     
    printf("Hai selezionato il comando %d\n",comando);  
            
    switch(comando) {                    
        case 1:                         
            Saluta();                         
            break;                    
        case 2:                         
            printf("NULL\n");                         
            break;                    
        case 3:                         
            printf("NULL\n");                         
            break;                    
        default:                         
            printf("inserito comando non valido\n");                   
    }                          
    
    system("PAUSE");     
    return 0;          
    }  
    
    void Saluta() {      
        char nome[20];      
        printf("Inserisci il tuo nome: ");      
        gets(nome);      
        printf("\nCiao %s\n",nome);      
    }
    Il Problema dello script è che se inserisco 1, quando entra nel case 1 non esegue la funziona correttamente, cioè non mi richiede l'input nome e va avanti,come se la variabile fosse vuota.
    Se inserisco la funziona all'eserno del case questa funziona correttamente.
    Io credo che nome prede come valore l'INVIO che digito quando inserisco il comando.
    Ditemi un pò voi come risolverlo, sicuramente è una cavolata ma per che sto iniziando ora non so che fare.
    Preciso che utilizzo gets() e non scanf() perchè altrimenti non posso mettere spazi nella stringa.
    Es. Nome "Pippo Paperino"

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    La fgets prende in input anche il carattere newline, così non hai bisogno di pulire il buffer di input:
    codice:
    void Saluta() {      
        char nome[20];      
        printf("Inserisci il tuo nome: ");      
        fgets(nome,20,stdin);      
        printf("\nCiao %s\n",nome);      
    }
    Inoltre se inserisci una stringa più lunga di 20 ti ignora quei caratteri, per cui non rischi il segmentation fault.

  3. #3
    Ho provato con FGETS,
    ma il problema rimane invariato,
    non mi viene data la possibile di inserire l'input "nome".
    Cmq problema non ancora risolto ^^

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Anche la scanf da problemi di pulitura del buffer, prova così:

    codice:
    scanf("%d\n", &comando);
    Ma in generale, è meglio prendere i valori in input usando fgets e atoi:

    codice:
    char buffer[100];
    fgets(buffer,100,stdin);
    comando=atoi(buffer);

  5. #5
    la funzione Saluta(), funziona correttamente sia con gets, fgets, scanf,
    se però la stessa viene chiamate all'asterno di cicli (if,switch).
    Nel mio caso io chiamo la funziona all'interno di uno Switch-Case e questo non capisco perchè
    provoca problemi e non la stessa non funziona correttamente.
    Funziona solo con scanf ma in questo caso non posso inserire spazi,
    se volessi inserire come nome "pinco pallino" verrebbe visualizzato solo pinco.
    Provate a eseguire il codice da voi.
    Vorrei sapere se è una limitazione del C o se bisogna inserire qualche accorgimento

  6. #6
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    prova ad aggiungere prima dello switch un fflush(stdin)
    Per gli Spartani e Sparta usa spartan Il mio github

  7. #7
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ma stai leggendo quello che ti scrivo?

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    void Saluta();
    int main()
    {
        int comando = 0;
        char buffer[100];
        printf("Comandi Disponibili:\n");
        printf("1 - Saluta\n");
        printf("2 - ???\n");
        printf("3 - ???\n");
        printf("Inserisci il Numero del comando: ");
        fgets(buffer,100,stdin);
        comando=atoi(buffer);
        printf("Hai selezionato il comando %d\n",comando);
        switch(comando)
        {
            case 1:
                Saluta();
                break;
            case 2:
                printf("NULL\n");
                break;
            case 3:
                printf("NULL\n");
                break;
            default:
                printf("inserito comando non valido\n");
        }
        return 0;
    }
    
    void Saluta()
    {
        char nome[20];
        printf("Inserisci il tuo nome: ");
        fgets(nome,20,stdin);
        printf("\nCiao %s\n",nome);
    }

  8. #8
    Oky ora ti ho capito ^^
    Io mettevo l'fgets solo dentro la funzione,
    sostituendo tutto come hai detto te va alla perfezione.
    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.