PDA

View Full Version : [C] problema scanf


bobosg
11-12-2009, 09:41
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

ndakota
11-12-2009, 11:11
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.

bobosg
11-12-2009, 11:25
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

ndakota
11-12-2009, 11:44
Non avete fatto la funzione getchar()? Vi ha mai parlato della funzione fflush()? Prova a mettere subito dopo la scanf questa istruzione:


fflush(stdin);

cionci
11-12-2009, 11:54
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

bobosg
11-12-2009, 14:40
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

cionci
11-12-2009, 15:08
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

cionci
12-12-2009, 07:19
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);

bobosg
16-12-2009, 19:21
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:

cionci
16-12-2009, 19:24
Ma tu già usavi %c :confused:
Il problema è leggere con %c dopo che hai letto con altri specificatori di formato.

bobosg
17-12-2009, 10:50
Ma tu già usavi %c :confused:
Il problema è leggere con %c dopo che hai letto con altri specificatori di formato.


ah......

bobosg
17-12-2009, 11:09
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.

cionci
17-12-2009, 11:11
In effetti è quello che ti ripetiamo dall'inizio :D

Sulla tua soluzione, non lo so, non l'ho mai provata.

bobosg
17-12-2009, 11:44
provaci, funziona!!!