Dsy Network www | forum | my | didattica | howto | wiki | el goog | stats | blog | dona | rappresentanti
Homepage
 Register   Calendar   Members  Faq   Search  Logout 
.dsy:it. : Powered by vBulletin version 2.3.1 .dsy:it. > Didattica > Corsi A - F > Algoritmi e strutture dati > C - getchar() in un ciclo
  Last Thread   Next Thread
Author
Thread    Expand all | Contract all    Post New Thread    Post A Reply
Collapse
guitux
.amico.

User info:
Registered: Jul 2008
Posts: 39 (0.01 al dì)
Location: milano
Corso: informatica
Anno:
Time Online: 5:53:50 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged
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?

13-10-2008 22:43
Click Here to See the Profile for guitux Click here to Send guitux a Private Message Find more posts by guitux Add guitux to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
darkshadow
Are You From The Past?

User info:
Registered: Jul 2007
Posts: 485 (0.07 al dì)
Location: Milano
Corso: Informatica Magistrale
Anno: 1
Time Online: 13 Days, 13:38:56 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged
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?


ciao.

è giusto quello che fa.

infatti usi la getchar dentro ad un ciclo è quindi ovvio che alla fine ti prenderà tutti i caratteri pero uno alla volta.

es. con questo pezzo di codice:

code:
while ((s=getchar()) != 'f'){ if (!isspace(s)) printf("\t%c\n", s); }


nel while li dico di leggere da stdin fino a quando non viene premuto 'f'.

l'if dentro al ciclo mi serve per saltare gli spazi (e anche INVIO)

se come input gli do:
abc

mi stampa:
a
b
c


se invece gli do:
a\n

mi stampa:
a
\
n
ed è giusto perchè lui prende ogni singolo carattere da stdin.
inoltre '\n' è per andare a capo ma lo si può fare anche facendo INVIO.

per quanto riguarda CTRL+CARATTERE qui credo non si possa fare molto perchè questi vengono in qualche modo trasformati in caratteri stampabili.

Ciao.


DS.

__________________
by Ð@rk§h@ÐØw

14-10-2008 09:50
Click Here to See the Profile for darkshadow Click here to Send darkshadow a Private Message Find more posts by darkshadow Add darkshadow to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
Bloom
.illuminato.

User info:
Registered: May 2006
Posts: 229 (0.03 al dì)
Location:
Corso:
Anno:
Time Online: 2 Days, 3:14:49 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

int lettura;
while(isspace(lettura=getchar()));

dovrebbe prendere tutti i caratteri finche non trova lo spazio

14-10-2008 14:48
Click Here to See the Profile for Bloom Click here to Send Bloom a Private Message Find more posts by Bloom Add Bloom to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
darkshadow
Are You From The Past?

User info:
Registered: Jul 2007
Posts: 485 (0.07 al dì)
Location: Milano
Corso: Informatica Magistrale
Anno: 1
Time Online: 13 Days, 13:38:56 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

Originally posted by Bloom
int lettura;
while(isspace(lettura=getchar()));

dovrebbe prendere tutti i caratteri finche non trova lo spazio


in realtà questo salta tutti gli spazi.

la funzione isspace(char) appunto controla se il parametro in ingresso è lo spazio
quindi il ciclo continua finchè ci sono spazi.

__________________
by Ð@rk§h@ÐØw

14-10-2008 15:20
Click Here to See the Profile for darkshadow Click here to Send darkshadow a Private Message Find more posts by darkshadow Add darkshadow to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
guitux
.amico.

User info:
Registered: Jul 2008
Posts: 39 (0.01 al dì)
Location: milano
Corso: informatica
Anno:
Time Online: 5:53:50 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

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...?

14-10-2008 19:57
Click Here to See the Profile for guitux Click here to Send guitux a Private Message Find more posts by guitux Add guitux to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
guitux
.amico.

User info:
Registered: Jul 2008
Posts: 39 (0.01 al dì)
Location: milano
Corso: informatica
Anno:
Time Online: 5:53:50 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

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?

14-10-2008 20:18
Click Here to See the Profile for guitux Click here to Send guitux a Private Message Find more posts by guitux Add guitux to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
darkshadow
Are You From The Past?

User info:
Registered: Jul 2007
Posts: 485 (0.07 al dì)
Location: Milano
Corso: Informatica Magistrale
Anno: 1
Time Online: 13 Days, 13:38:56 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

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



ciao.


DS.

__________________
by Ð@rk§h@ÐØw

14-10-2008 21:44
Click Here to See the Profile for darkshadow Click here to Send darkshadow a Private Message Find more posts by darkshadow Add darkshadow to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
guitux
.amico.

User info:
Registered: Jul 2008
Posts: 39 (0.01 al dì)
Location: milano
Corso: informatica
Anno:
Time Online: 5:53:50 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

:) ecco la risposta che cercavo! funziona!
grazie!

15-10-2008 18:40
Click Here to See the Profile for guitux Click here to Send guitux a Private Message Find more posts by guitux Add guitux to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
guitux
.amico.

User info:
Registered: Jul 2008
Posts: 39 (0.01 al dì)
Location: milano
Corso: informatica
Anno:
Time Online: 5:53:50 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

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


sapresti spiegarmi il motivo?

15-10-2008 18:55
Click Here to See the Profile for guitux Click here to Send guitux a Private Message Find more posts by guitux Add guitux to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
Gaugamelek
.precettore.

User info:
Registered: Mar 2007
Posts: 83 (0.01 al dì)
Location:
Corso:
Anno:
Time Online: 2 Days, 8:32:58 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

15-10-2008 19:01
Click Here to See the Profile for Gaugamelek Click here to Send Gaugamelek a Private Message Find more posts by Gaugamelek Add Gaugamelek to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
guitux
.amico.

User info:
Registered: Jul 2008
Posts: 39 (0.01 al dì)
Location: milano
Corso: informatica
Anno:
Time Online: 5:53:50 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

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...

15-10-2008 19:45
Click Here to See the Profile for guitux Click here to Send guitux a Private Message Find more posts by guitux Add guitux to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
darkshadow
Are You From The Past?

User info:
Registered: Jul 2007
Posts: 485 (0.07 al dì)
Location: Milano
Corso: Informatica Magistrale
Anno: 1
Time Online: 13 Days, 13:38:56 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged
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; }



ciao.

DS.

__________________
by Ð@rk§h@ÐØw

15-10-2008 21:54
Click Here to See the Profile for darkshadow Click here to Send darkshadow a Private Message Find more posts by darkshadow Add darkshadow to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
guitux
.amico.

User info:
Registered: Jul 2008
Posts: 39 (0.01 al dì)
Location: milano
Corso: informatica
Anno:
Time Online: 5:53:50 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

ok! ora è a prova di scimmia!
ciao!

16-10-2008 17:26
Click Here to See the Profile for guitux Click here to Send guitux a Private Message Find more posts by guitux Add guitux to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
All times are GMT. The time now is 11:30.    Post New Thread    Post A Reply
  Last Thread   Next Thread
Show Printable Version | Email this Page | Subscribe to this Thread | Add to Bookmarks

Forum Jump:
Rate This Thread:

Forum Rules:
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is OFF
vB code is ON
Smilies are ON
[IMG] code is ON
 

Powered by: vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento | Licenze | Thanks | Syndacate
Pagina generata in 0.057 seconds (67.81% PHP - 32.19% MySQL) con 26 query.