View Full Version : [C] problema scanf
ciao a tutti il mio problema è questo.
mi sto esercitando per l'esame di programmazione e qualche giorno fa mi capitò che uno scanf per un carattere non mi funzionava anche se a mio avviso la sintassi è corretta.cmq continuai ad esercitarmi.
oggi mi ritrovo dinanzi ad un altro scanf per l'aquisizione di un carattere e ancora problemi
in pratica ho un ciclo do while con la condizione che (choice=='y')
ora questo scanf mi fa saltare tutto:
printf("Would you like to play again? (y or n)?\n");
scanf("%c", &choice);
la variabile è char choice='y';
spero riuscite a capire perchè gli scanf per i caratteri non mi funzionano cosa sbaglio???
grazieeeeeee
Non conosco il C ma prova ad usare getchar() che restituisce un int(il carattere letto).
int getchar()
Forse nel tuo caso prendi il carattere da tastiera ma l'invio rimane nel buffer e fa macelli.
Non conosco il C ma prova ad usare getchar() che restituisce un int(il carattere letto).
int getchar()
Forse nel tuo caso prendi il carattere da tastiera ma l'invio rimane nel buffer e fa macelli.
si ma io dovrei usare cose che abbiamo affrontato durante il corso
Non avete fatto la funzione getchar()? Vi ha mai parlato della funzione fflush()? Prova a mettere subito dopo la scanf questa istruzione:
fflush(stdin);
Non avete fatto la funzione getchar()? Vi ha mai parlato della funzione fflush()? Prova a mettere subito dopo la scanf questa istruzione:
fflush(stdin);
fflush non si usa per stdin. Non è un utilizzo previsto dallo standard.
Spiega meglio cosa ti succedeva. Hai usato qualche altra funzione per l'input oltre a scanf ? Ad esempio gets ?
BlackAuron
11-12-2009, 12:05
Prova a postare il codice per intero, di certo è più utile che qualche riga qua e la :) e sicuro di aver dichiarato choice come char e non come stringa? a quel punto l'& andrebbe levato.
PS: quando posti codice, scrivilo all'interno degli appositi tag
(PHP)(/PHP)
con le quadre al posto delle tonde
int main(){
char choice='y';
do{
scanf("%d", &guess);
if(guess>number){
x++;
}
if(guess<number){
y++;
}
if(guess==number){
printf("Would you like to play again? (y or n)?\n");
scanf("%c", &choice);
}
}while(choice=='y');
questi sono i punti salienti del programma
C'è un invio che resta nello stdin.
Il problema è dovuto a scanf con %c che legge qualsiasi carattere presente nello stdin, anche uno '\n', cioè l'invio.
La prima scanf lascia l'invio nello stdin, la seconda trova l'invio, lo assegna a choice ed esce perché choice è diverso da 'y'.
se potessi usare la getchar si farebbe:
while(getchar() != '\n');
Legge tutti i caratteri nello stdin fino a quando non trova uno '\n'.
Visto che la puoi usare per togliere lo '\n' puoi fare così:
do scanf("%c", &choice); while(choice != '\n');
E dopo leggi nuovamente choice.
BlackAuron
11-12-2009, 23:43
alternativamente ( e vado a memoria), modifica lo scanf cosi:
scanf("%d\n", &guess);
e leggi direttamente con lo scanf pure l'invio
Così non funziona ;) Anzi, ti chiede un nuovo input da stdin che dopo ti rimane nel buffer.
Così semmai posso leggere sia l'intero che lo '\n':
scanf("%d%c", &guess, &tmp);
RISOLTO!!!
int main(){
char c;
printf("inserire carattere: ");
scanf("%c", &c);
printf("il carattere immesso: %c\n", c);
}
ho scritto questo spezzone di codice per far capire che per l'immissione di caratteri questo funziona
mentre per l'immissione di stringhe:
int main(){
char string[20];
printf("inserire stringa: ");
scanf("%s", string);
printf("string is: %s\n", string);
}
questo spiega che era solo un problema di SPECIFICA DI CONVERSIONE.
per i singoli caratteri si usa %c
ciao a tutti e grazie
spero di essere stato utile!!!:Prrr:
Ma tu già usavi %c :confused:
Il problema è leggere con %c dopo che hai letto con altri specificatori di formato.
Ma tu già usavi %c :confused:
Il problema è leggere con %c dopo che hai letto con altri specificatori di formato.
ah......
C'è un invio che resta nello stdin.
mi sono soffermato tu questo punto e informandomi un pò ho capito che ogni volta che si inserisce un numero (o chicchessia) in input il numero viene inserito in in area di memoria chiamata buffer e da lì lo scanf legge e porta nella variabile dove devono essere memorizzati però!
il però è che lo scanf non si prende l'invio che resta quindi nel buffer, di conseguenza al successivo scanf del famoso carattere si va a prendere l'invio e non considera il carattere e quindi una soluzione che ho trovato è
scanf("\n%c",&carattere)
che legge il carattere invio e lo scarta, poi legge il carattere successivo e questo viene assegnato alla variabile.
In effetti è quello che ti ripetiamo dall'inizio :D
Sulla tua soluzione, non lo so, non l'ho mai provata.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.