PDA

View Full Version : [Principiante C] Domanda su getchar()


frncmrt
06-07-2004, 23:07
Sto muovendo i miei primi passi nel C, e mi trovo dinanzi ad un problema che vorrei capire se nasce da un mio fraintendimento del getchar(), da un mio errore di scrittura o altro.
Se io utilizzo getchar() per leggere un carattere all'interno di un ciclo for ed utilizzare tale carattere in una struttura switch:

es. (il programmino è volutamente semplicistico ed inutile per cercare di esporre il problema nella forma più chiara spero possibile):


for (cont =1; cont = 10; cont++){
carattere = getchar();

switch (carattere){

case 'a':
variabile = 1;
break;

case 'b':
variabile = 2;
break;

case 'd':
variabile = 3;
break;

case '\n': /*è giusto per ignorare il carattere nell'input?*/
break;

default:
printf("Non hai inserito un carattere corretto.\n");
cont--; /*per non considerare questo inserimento nel conteggio*/
}
totale += variabile;
}



succede che il for viene eseguito (cioè, viene inserita la variabile "carattere") un numero dimezzato di volte rispetto a quanto mi sarei aspettato.
Ho capito con il debug (ci ho messo un po' :muro: ) , che questo avviene perchè, quando vado ad inserire il "carattere", e premo invio per far leggere al programma la lettera, la prima volta che il ciclo viene eseguito mi viene considerata la lettera come carattere imesso (a,b,c, o altro), mentre la seconda volta che viene eseguito il ciclo, mi viene considerato automaticamente l'invio come carattere imesso e quindi salto al valore di cont successivo (più brevemente, nonostante abbia fatto un unico inserimento nella forma lettera +[return], il getchar() legge due valori).
Come dovrei fare perchè invece l'invio non venga letto?

Ho provato con un escamotage, cioè raddoppiando la lunghezza del ciclo for, ma mi pare molto raffazzonata come soluzione.

Ringrazio chiunque riesca a darmi un prezioso suggerimento.

Ed_Bunker
06-07-2004, 23:46
Scusami ma non ho ben capito cosa tu intenda fare con quella condizione nel for ovvero for (count = 1, count = 10, cont++)

Se non ho capito male sarebbe piu' "decente" un semplice for(cont=0, cont < 10, cont++)...

Quello che ti da qualche "problema" e' il fatto che la getchar() effettui la bufferizzazione e pertanto finche' non hai digitato un certo numero di caratteri sulla stessa linea oppure non hai fatto una new line non fa nessuna azione (Penso...). Potresti semplicemente fare:
...
case '\n':
cont--; break; /*Cosi' lo ignori*/

Prova...

nark81
07-07-2004, 00:49
scusa è da 3 anni che non utilizzo c.. ma io lo modificherei cosi:

for (cont =1; cont = 10; cont++){
carattere = getchar();

switch (carattere){

case 'a':
variabile = 1;
break;

case 'b':
variabile = 2;
break;

case 'd':
variabile = 3;
break;

default:
printf("Non hai inserito un carattere corretto.\n");
cont--; /*per non considerare questo inserimento nel conteggio*/
}
cont--;
totale += variabile;
}

occhio pero che cosi puoi inserire solo un valore da tastiera alla volta senza utilizzare il buffer di getchar() che ti consentirebbe una lettura di piu valori. (non ho provato però).

Ed_Bunker
07-07-2004, 09:35
Originariamente inviato da nark81
scusa è da 3 anni che non utilizzo c.. ma io lo modificherei cosi:

for (cont =1; cont = 10; cont++){
carattere = getchar();

switch (carattere){

case 'a':
variabile = 1;
break;

case 'b':
variabile = 2;
break;

case 'd':
variabile = 3;
break;

default:
printf("Non hai inserito un carattere corretto.\n");
cont--; /*per non considerare questo inserimento nel conteggio*/
}
cont--;
totale += variabile;
}

occhio pero che cosi puoi inserire solo un valore da tastiera alla volta senza utilizzare il buffer di getchar() che ti consentirebbe una lettura di piu valori. (non ho provato però).

Cosa vorra' dire for (cont =1; cont =10; cont++) proprio non lo so ...
:confused:

cionci
07-07-2004, 09:53
Infatti quel ciclo viene fatto sempre e solo una volta...

frncmrt
07-07-2004, 11:32
Originariamente inviato da Ed_Bunker
Cosa vorra' dire for (cont =1; cont =10; cont++) proprio non lo so ...
:confused:

Ehm...errore di scrittura:
la forma corretta sarebbe
for (cont =1; cont <=10; cont++)

Risolvo come suggerito da voi inserendo in
case 'n':
cont-- etc;

era giusto per sapere se magari avevo frainteso il funzionamento di getchar, e se quello che mi risultava era normale.

Grazie ancora
ciao