PDA

Visualizza la versione completa : [C] Chiamata di funzione all'interno di un case


PinnaWarner
03-02-2012, 17:42
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:



#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"

ramy89
03-02-2012, 18:49
La fgets prende in input anche il carattere newline, così non hai bisogno di pulire il buffer di input:


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.

PinnaWarner
03-02-2012, 19:00
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 ^^

ramy89
03-02-2012, 19:13
Anche la scanf da problemi di pulitura del buffer, prova così:



scanf("%d\n", &comando);


Ma in generale, è meglio prendere i valori in input usando fgets e atoi:



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

PinnaWarner
03-02-2012, 19:23
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 :)

linoma
03-02-2012, 19:26
prova ad aggiungere prima dello switch un fflush(stdin)

ramy89
03-02-2012, 19:55
Ma stai leggendo quello che ti scrivo? :confused:



#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);
}

PinnaWarner
03-02-2012, 22:13
Oky ora ti ho capito ^^
Io mettevo l'fgets solo dentro la funzione,
sostituendo tutto come hai detto te va alla perfezione.
Grazie

Loading