|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2003
Città: Milano
Messaggi: 2894
|
dubbio sulla SCANF
nn riesco a capire il perchè di questa cosa
uso devc++ se io faccio questo Codice:
#include <stdio.h>
#include <stdlib.h>
main (){
int x; char b;
printf("inserire numero\n");
scanf("%d",&x);
printf("inserire lettera\n");
scanf("%c",&b);
printf("%d %c",x,b);
getch();}
inserire numero (lo inserisco e do invio, ad esempio inserisco 10) inserire lettera10 nn mi fa inserire il carattere e se do invio termina. facendo un po' di prove ho scoperto che invece se faccio Codice:
#include <stdio.h>
#include <stdlib.h>
main (){
int x; char b;
printf("inserire numero\n");
scanf("%d",&x);
printf("inserire lettera\n");
scanf("\n%c",&b);
printf("%d %c",x,b);
getch();}
inserire numero (lo inserisco e do invio) inserire lettera(la inserisco e do invio) mi visualizza numero e lettera. se però in entrambe le scanf gli faccio leggere dei numeri il programma va bene anche senza mettere \n nella seconda scanf. mi spiegate il motivo pls
__________________
P4 2.8 NorthwoodC - 2x256 vitesta ddr500 + 1GB Kingston ddr400 - P4C800-Deluxe - SAPPHIRE Radeon X1950pro 512MB AGP - Samsung 931BW Macbook Alu |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
La prima scanf legge tutti i caratteri che rappresentano il numero ma lascia nel buffer di input il carattere '\n'. Quando subito dopo vai a leggere un carattere qualsiasi con '%c' scanf trova nel buffer quel '\n' e termina subito.
ciao |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2003
Città: Milano
Messaggi: 2894
|
quindi c'è anche un altro modo di agire oppure devo fare come ho fatto io e basta.
ma perchè lo fa solo coi caratteri e nn coi numeri?
__________________
P4 2.8 NorthwoodC - 2x256 vitesta ddr500 + 1GB Kingston ddr400 - P4C800-Deluxe - SAPPHIRE Radeon X1950pro 512MB AGP - Samsung 931BW Macbook Alu |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
Quote:
Prova a mettere la funzione fflush(stdin); a fine di ogni scanf
__________________
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2003
Città: Milano
Messaggi: 2894
|
come mai facendo due scanf con due numeri nn da questo problema?
__________________
P4 2.8 NorthwoodC - 2x256 vitesta ddr500 + 1GB Kingston ddr400 - P4C800-Deluxe - SAPPHIRE Radeon X1950pro 512MB AGP - Samsung 931BW Macbook Alu |
|
|
|
|
|
#6 |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16212
|
Queste cose sono spiegate molto bene sul Kernighan&Ritchie, che dovrebbe far parte della tua biblioteca.
Il sunto è un po' questo: quando chiami scanf con una stringa di parametro che indica solo un numero decimale, lei legge un carattere alla volta finché non ne incontra uno che può far parte di un numero. A quel punto, incomincia a convertire la stringa che legge in un valore numerico binario, e continua finché non incontra un carattere che non può far parte di un numero. A quel punto, rimette sullo standard input l'ultimo carattere letto e termina.
__________________
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 |
|
Member
Iscritto dal: Feb 2005
Città: Prato
Messaggi: 149
|
Ciao,
Proprio per questo (ed altri motivi, tra cui i famigerati attacchi di buffer overflow, ma più semplicemente la lettura corretta di una %s contenente spazi) conviene in generale evitare l'uso di scanf... Prova ad utilizzare gets() [ tra l'altro rimuove il \n finale rimpiazzandolo con un \0 ] per leggere una linea ed operare una conversione (con atoi,atol,atof) quando si tratta di un numero... Ciaociao
__________________
Venite a visitarci qui:http://www.bottomap.com Bottomap is a proud Masterdrive.it moderator |
|
|
|
|
|
#8 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16212
|
Quote:
__________________
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 |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
A stò punto è ancora meglio utlizzare getch e putch in serie, dove lo metti in un ciclo e finchè non incontra un carattere (per esempio '\n') continua l'inserimento dei caratteri nell'array.
Così riesci pure ad impedire all'utente, per esempio se occorre digitare solamente caratteri di numeri, l'inserimento di altri caratteri nell'array.
__________________
|
|
|
|
|
|
#10 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16212
|
Quote:
Ma non lo è, e bisogna trovare l'equivalente per ciascun caso: conio per DOS, curses per *NIX, eccetera. Se invece si ha a disposizione solo la libreria standard, l'unica cosa sicura è usare fgets, eventualmente associata a un controllo sulla struttura della stringa inserita.
__________________
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 |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:14.



















