![]() |
Show 150 posts per page |
.dsy:it. (http://www.dsy.it/forum/)
- Algoritmi e strutture dati (http://www.dsy.it/forum/forumdisplay.php?forumid=207)
-- C - getchar() in un ciclo (http://www.dsy.it/forum/showthread.php?threadid=36642)
C - getchar() in un ciclo
Ciao!
Come posso prelevare uno e uno solo carattere da stdin in un ciclo?
attraverso char c =getchar() o con scanf("%c",&c) in un ciclo, se l'utende digita aCTRL+D (su unix) o aCTRL+Z INVIO (su windows) va tutto a buon fine...
ma se l'utente digita ad es: abCTRL+D o ab\n, getchar() considera tutti i caratteri, quindi non solo il primo 'a', ma anche i seguenti 'b' '\n'
idee?
Re: C - getchar() in un ciclo
Originally posted by guitux
Ciao!
Come posso prelevare uno e uno solo carattere da stdin in un ciclo?
attraverso char c =getchar() o con scanf("%c",&c) in un ciclo, se l'utende digita aCTRL+D (su unix) o aCTRL+Z INVIO (su windows) va tutto a buon fine...
ma se l'utente digita ad es: abCTRL+D o ab\n, getchar() considera tutti i caratteri, quindi non solo il primo 'a', ma anche i seguenti 'b' '\n'
idee?
code:
while ((s=getchar()) != 'f'){ if (!isspace(s)) printf("\t%c\n", s); }
__________________
by Ð@rk§h@ÐØw
int lettura;
while(isspace(lettura=getchar()));
dovrebbe prendere tutti i caratteri finche non trova lo spazio
Originally posted by Bloom
int lettura;
while(isspace(lettura=getchar()));
dovrebbe prendere tutti i caratteri finche non trova lo spazio
__________________
by Ð@rk§h@ÐØw
grazie delle risposte! però forse mi sono espresso male...
la mia funzione aspetta un (e uno solo) determinato carattere dallo standard input.
Supponiamo che l'utente immetta più di un carattere, io posso optare per due soluzioni, o considero solo il primo carattere o restituisco un messaggio d'errore "hai digitato più di un carattere".
Se cerco di risolvere questo problema con la pirma possibile soluzione non saprei come considerare solo il primo carattere e tralascaire i restanti caratteri. come si fa?
Mentre se cerco di risolvere il problema con la seconda soluzione otterrei N messaggi d'errore, dove N è il numero di caratteri digitati dall'utente (ovviamente N > 1) dato che sono in un ciclo.
quindi:
come posso prelevare solo il primo carattere e non considerare gli altri?
forse potrei leggere una stringa invece di un carattere e controllare la lunghezza della stringa... però non mi sembra una soluzione ottimale...?
IN PAROLE POVERE...
getchar() preleva da stdin un solo carattere.
se getchar() è situato all'interno di un ciclo preleva sempre e comunque un solo carattere, ma preleva un solo carattere "alla volta", nel senso che il ciclo si ripeterà N volte, dove N è il numero di caratteri digitati dall'utente.
Io non voglio che il ciclo si ripeta N volte, perchè otterrei un costo superfluo maggiore, ovvero spreco di tempo e "denaro"... come posso fare in modo che se l'utente digita più caratteri (invece di uno) il ciclo venga eseguito solo una volta e non N volte?
 
ancora + facile.
il codice è il seguente:
code:
int s;      ----> oppure char s; (che è la stessa cosa) while ( isspace (s = getchar() ) );    con questo rimango nel ciclo fino a quando non leggo un carattere. printf ("\n\t%c", s);
__________________
by Ð@rk§h@ÐØw
ecco la risposta che cercavo! funziona!
grazie!
la tua funzione è corretta...
xo non capisco perchè nel mio programmino non funziona...
code:
/*******GIOCO -- RICERCA DICOTOMICA********/ #include <stdio.h> #define FALSE 0; #define TRUE 1; typedef int Bool; int main(void) { printf("pensa ad un numero X tale che 0<=X<=1000!\n"); printf("se il numero è corretto digita =, se maggiore >, se minore <\n"); int min = 0; int max = 1000; int n; char c; Bool trovato = FALSE; do { n = (min + max) / 2; printf("Il numero è %d? ",n); while( isspace(c = getchar()) ); switch(c) { case '=' : trovato=TRUE; break; case '>' : min=n; break; case '<' : max=n; break; default : printf(" carattere non valido!"); } printf("\n"); } while(!trovato); return 0; }
una risposta non risposta... perchè? forse non ho formulato una domanda precisa o forse ti aspettavi quale programma...
comunque:
con questo banalissimo programmino se l'utente digitasse:
>yyyyyyyyyy yyyyyyyyy
io otterrei N messaggi "carattere non valido".
vorrei evitarlo. come? forse la risposta è molto banale... però non ne vengo a capo...
soluzione
 
ciao.
eccoti la soluzione al tuo problema, l'ho testato ed è a prova di scimmia.
ho solo aggiunto una riga di codice (anche se composta).
code:
#include <stdio.h> #include <ctype.h> #define FALSE 0; #define TRUE 1; typedef int Bool; int main(void) { printf("pensa ad un numero X tale che 0<=X<=1000!\n"); printf("se il numero è corretto digita =, se maggiore >, se minore <\n"); int min = 0; int max = 1000; int n; char c; Bool trovato = FALSE; do { n = (min + max) / 2; printf("Il numero è %d? ",n); while( isspace(c = getchar()) ); switch(c) { case '=' : trovato=TRUE; break; case '>' : min=n; break; case '<' : max=n; break; default : printf(" carattere non valido!"); } printf("\n"); while( (c = getchar()) != '\n' ); ----> con questo togli tutti i caratteri che stanno dopo il primo che ti interessa (sia esso valido o meno). } while(!trovato); return 0; }
__________________
by Ð@rk§h@ÐØw
ok! ora è a prova di scimmia!
ciao!
| All times are GMT. The time now is 04:41. | Show all 13 posts from this thread on one page |
Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.