stichtom (Member)
Newbie
Messaggi: 4
Iscritto: 21/10/2012
|
Ciao a tutti, sto cercando di realizzare un controllo sul dato inserito dall'utente, ma sto incontrando parecchie difficoltà. In particolare il numero inserito deve essere positivo e un intero.
Il codice che ho scritto funziona correttamente se inserisco un numero negativo, ma quando inserisco un carattere (tipo una lettera) o un numero con la virgola, il programma funziona stranamente: nel caso di un carattere incomincia un ciclo infinito in cui continua a ripetere il do while, mentre se inserisco un numero con la virgola, mi dice correttamente di inserire un nuovo valore, ma poi esce immediatamente dal programma senza farmelo inserire nuovamente.
Qualcuno mi sa dire dove ho sbagliato? Grazie
Codice sorgente - presumibilmente C++ |
#include <stdio.h> int main() { int n,check; char c; do { printf("Inserisci un intero positivo: "); check = scanf("%d%c",&n,&c); } while (check != 2 || c!= '\n' || n<0); return 0; }
|
Ultima modifica effettuata da stichtom il 09/10/2014 alle 21:43 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
Per questo tipo di problemi devi evitare di usare la scanf.
Per l'input usa la fgets e inserisci tutto in una stringa (un array di char abbastanza grande), poi controlla il contenuto della stringa e validalo secondo le tue esigenze.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
stichtom (Member)
Newbie
Messaggi: 4
Iscritto: 21/10/2012
|
Purtroppo non posso usare ancora array o cose ""avanzate"", ma devo limitarmi a cose abbastanza base. Comunque ho risolto inserendo un "fflush(stdin);" che invece, ironicamente, abbiamo già fatto. Purtroppo so che è una soluzione veramente non funzionale dato che è compatibile solo con Windows...
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
Se inserisci una lettera con la scanf non credo che la fflush possa risolvere. Comunque, al posto della fflush puoi usare la linea
while(getchar() != '\n') ;
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
pbe (Normal User)
Pro
Messaggi: 131
Iscritto: 24/05/2014
|
Anchio ho lo stesso problema che ha avuto Stichtom, io applicando un codice quasi uguale al suo mi succedeva che se mettevo un carattere il programma andava in loop continuo senza potersi più fermare. Il codice stava in un do-while. Qualcuno mi può chiarire le idee?
|
|
pbe (Normal User)
Pro
Messaggi: 131
Iscritto: 24/05/2014
|
Se interessa ancora ecco la soluzione che ho trovato:
Codice sorgente - presumibilmente C/C++ |
int c;
printf ("Inserisci un numero intero : ");
do
{
c = scanf("%d",&num[i]);
if (c == 0)
{
scanf ("%*[^\n]");
printf ("\nAttenzione: input non valido.\n\nInserisci un numero intero : ");
}
}
while(c == 0);
|
La riga "scanf ("%*[^\n]");" ha circa la stessa funzione del fflush()
Ultima modifica effettuata da pbe il 12/01/2015 alle 15:11 |
|
orsobimbo (Normal User)
Newbie
Messaggi: 8
Iscritto: 27/12/2014
|
Ciao approfitto anche io per dire la mia
Dal testo si riassume :
- Accetta solo numeri con segno e positivi
- Senza utilizzare array
Non specifica se :
- Poter uscire dal programma tramite un tasto dedicato
- quanti dati deve accettare
Codice sorgente - presumibilmente C++ |
// stichtom.cpp : definisce il punto di ingresso dell'applicazione console. // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int n,c; do { do { printf("Inserisci un intero positivo ( 0 per terminare): "); scanf_s("%d",&n); } while (n>0); // accetta tutti i numeri con segno e positivo while((c = getchar()) != '\n' ); //Pulisce il buffer if (n<0) printf("Hai inserito un umero con segno negativo non richiesto..\n"); //Quindi repete l'input } while(n!=0); // continua fino alla pressione del tasto '0' printf("Hai inserito il numero zero per terminare l'input\nPremi un tasto per continuare"); getchar(); return 0; }
|
Edit: l'ho testato prima di postarlo , ma all'ultimo è saltato fuori il problema del loop citato sopra
Ultima modifica effettuata da orsobimbo il 12/01/2015 alle 19:06 |
|
orsobimbo (Normal User)
Newbie
Messaggi: 8
Iscritto: 27/12/2014
|
Postato originariamente da pbe:
Se interessa ancora ecco la soluzione che ho trovato:
.........................
La riga "scanf ("%*[^\n]");" ha circa la stessa funzione del fflush()
|
Ultima modifica effettuata da orsobimbo il 12/01/2015 alle 19:34 |
|
pbe (Normal User)
Pro
Messaggi: 131
Iscritto: 24/05/2014
|
Sì, esatto.
|
|