|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | |
|
Senior Member
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1843
|
[C] Piccolissimo problema scanf e printf
Quote:
Se io aggiungo ad esempio alla fine un printf che stampa il carattere vedo che non ha letto niente ed il programma termina, quale può essere il problema di avere due scanf di seguito? Mi sembra molto strano. |
|
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Jan 2005
Città: London, United Kingdom
Messaggi: 959
|
Quote:
__________________
zattix |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1843
|
Quote:
Ho provato anche a fare un programma a parte perchè questo codice è all'interno di un programma e mi da lo stesso problema, assurdo. Uso il dev c++. Booooooooooooooooo |
|
|
|
|
|
|
#4 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
La prima scanf prende il carattere. La seconda prende il newline. Prova a pulire lo standard input dopo il primo inserimento, così: Codice:
while (getchar() != '\n')
;
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Ziosilvio perchè la prima scanf prende solo i caratteri senza il newline (che poi viene preso dalla seconda scanf)??
|
|
|
|
|
|
#6 |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quando passi gli argomenti "%c" e &p1 a scanf, le stai dicendo che deve leggere dallo standard input una sequenza costituita da un unico carattere, e poi scrivere quel carattere nella regione della memoria corrispondente a p1.
Ora, l'input-output standard del C è bufferizzato: pertanto i caratteri che immetti con la tastiera non vengono depositati sullo standard input fino alla pressione del tasto Invio, che però ha anche l'effetto di accodare un newline. Il risultato è che (supponendo che l'utente scriva un carattere e poi prema Invio) quando la prima scanf viene chiamata, sullo standard output c'è una sequenza del tipo '\0xy''\n': dopo l'esecuzione della prima scanf, '\0xy' è stato rimosso dallo standard input, ma '\n' c'è ancora. Perciò lo standard input non è vuoto quando la seconda scanf viene chiamata, e quella parte subito senza aspettare che l'utente scriva nulla.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
In pratica la scanf, a meno di particolari parametri (%s con il limitatore a \n), non rimuove lo \n finale dallo stream...
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 3852
|
Approfitto di questa vecchia discussione per chiedere un paio di cose inerenti al tema:
c'e' una funzione per svuotare lo standard input del tutto prima di una nuvoa scanf o va fatta a mano in qualche modo (come)? Seconda cosa: utilizzando lo stesso target (un array di caratteri) è possibile leggere anche piu' parole separate dallo spazio invece che solo la prima? Ovviamente non potendo prevedere in anticipo quante sono le parole...
__________________
Cerco fotocamera con buono zoom!! CLICCA! ° Moderatore del Forum Ufficiale di ElaborarE (responsabile sezione HI-FI e Car Audio) ° |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Per la prima, non ci sono funzioni standard, su alcuni sistemi flush() funziona, ma lo standard impone di usarlo solo sugli stream di output.
In alternativa il codice è stato postato poco sopra: while (getchar() != '\n') ; Per la lettura ti consiglio fgets: http://www.cplusplus.com/reference/c...dio/fgets.html Come terzo parametro inserisci stdin (in questo modo ti legge dallo stdinput. |
|
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 3852
|
Quote:
Quote:
__________________
Cerco fotocamera con buono zoom!! CLICCA! ° Moderatore del Forum Ufficiale di ElaborarE (responsabile sezione HI-FI e Car Audio) ° |
||
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Ti riferisci alla fread ? Sinceramente non mi sembra per niente simile |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 3852
|
Quote:
http://www.opengroup.org/onlinepubs/...ions/read.html da usare sullo stdin, ma ora leggendo la specifica mi pare di capire che non è consigliabile per leggere una serie di parole da stdin... ho provato ad usarla ma mi crea alcuni comportamenti strambi (penso non vada molto d'accordo con le printf che uso per stampare all'utente il da farsi prima di analizzare il suo input). Potrebbe essere?
__________________
Cerco fotocamera con buono zoom!! CLICCA! ° Moderatore del Forum Ufficiale di ElaborarE (responsabile sezione HI-FI e Car Audio) ° |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quella read non è nello standard del C
In ogni caso è simile alla fread, quindi il discorso non cambia. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:55.




















