PDA

Visualizza la versione completa : [C++] Funzione scanf() per carattere da tastiera


Dark867
21-07-2011, 09:48
Ciao, ho il solito problema dello scanf del char, ovvero del buffer di input ma non riesco a risolverlo nel modo usuale... ecco le poche linee di codice che non vanno:

char buffer[100];
char c;
printf("Scrivi una stringa>");
scanf("%s",buffer);
printf("Adesso scrivi un carattere, a scelta tra [s\\n]");
fflush(stdin);
scanf("%c",&c); //questo viene saltato
printf("Stringa: %s e carattere %c ",buffer,c);
Come vedete ho messo il fflush dello standard input, eppure ho lo stesso errore...come mai??

oregon
21-07-2011, 11:00
Il codice lavora correttamente, su Windows e Visual Studio.

Su quale sistema e con quale compilatore lavori?

Dark867
21-07-2011, 11:11
...l'ho sempre pensato che il visualc++ è il miglior compilatore...infatti su windows funziona!
Il problema è che non va su linux, usando l'ultima versione di gcc.
C'è anche il problema che il codice non è per me, ma x una xsona che usa il dev cpp come IDE (e non vuole cambiarlo=_=), usando quindi cygwin con una versione ancora + vekkia del gcc.

oregon
21-07-2011, 15:00
Originariamente inviato da Dark867
...l'ho sempre pensato che il visualc++ è il miglior compilatore...infatti su windows funziona!

No, il fatto è che la fflush di stdin non è standard e quindi dipende dal compilatore.

Il VC la implementa in quel modo ma non significa che sia migliore per questo.


Il problema è che non va su linux, usando l'ultima versione di gcc.

Ed è corretto dato che non è standard.

Non utilizzare la fflush ma un metodo più generale, come


while(getchar()!='\n') ;

Dark867
21-07-2011, 15:35
Propone anche funzioni per la gestione di stringhe ottimizzate rispetto a quelle classiche, segnala warnings che normalmente gcc non segnala...insomma,dopo anke quest'ultima cosa, x me lo batte in toto.
Grazie del suggerimento ma alla fine ho deciso di sprecare un altro buffer e prendermi l'input come stringa invece che come char.

oregon
21-07-2011, 15:44
Originariamente inviato da Dark867
Propone anche funzioni per la gestione di stringhe ottimizzate rispetto a quelle classiche, segnala warnings che normalmente gcc non segnala...insomma,dopo anke quest'ultima cosa, x me lo batte in toto.

Punti di vista ... per qualcosa posso essere d'accordo, per altro no ...


Grazie del suggerimento ma alla fine ho deciso di sprecare un altro buffer e prendermi l'input come stringa invece che come char.

Non usare la scanf ... utilizza funzioni "sicure" ...

Celebron
21-07-2011, 15:57
Originariamente inviato da Dark867
Propone anche funzioni per la gestione di stringhe ottimizzate rispetto a quelle classiche, segnala warnings che normalmente gcc non segnala...insomma,dopo anke quest'ultima cosa, x me lo batte in toto.
Grazie del suggerimento ma alla fine ho deciso di sprecare un altro buffer e prendermi l'input come stringa invece che come char.

fidati, in ambiente professionale nessuno preferisce vc++ a gcc, nemmeno lontanamente.
proprio per il fatto che vc++ si prende "libertà" che non dovrebbe avere, spesso ignorando lo standard.

Dark867
21-07-2011, 20:20
Vabbè io parlo x me...se si piglia libertà su cui condivido ben venga!:)
Non ho capito bene...cos'ha la mia soluzione ke nn va?A quanto vedo scanf con %s funziona bene, ignorando gli \n e i vari caratteri di separazione...

oregon
21-07-2011, 20:32
Originariamente inviato da Dark867
Non ho capito bene...cos'ha la mia soluzione ke nn va?A quanto vedo scanf con %s funziona bene, ignorando gli \n e i vari caratteri di separazione...

E' una questione di sicurezza, non di funzionalità ... probabilmente adesso non ti interessa, ma in ambito professionale, la cosa diventa importante.

La scanf (e altre funzioni) è soggetta a "buffer overflow" ...

P.S. ke nn ... per favore, non usare abbreviazioni da sms ... questo non è un sms e la lettura diventa fastidiosa ...

Dark867
21-07-2011, 20:40
Vero, non avevo pensato al buffer overflow! In effetti col c++ non ho di questi problemi visto che utilizzo la cin.getLine ... vabbè alla fine qui stiamo parlando solo di un esercizietto isolato, preferisco avere un codice pulito piuttosto che sporcarlo con dei while in più.

ps. è per abbreviare...siamo su internet, non sto scrivendo una lettera al presidente della pubblica istruzione...

Loading