Oppure

Loading
09/10/14 19:41
stichtom
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
#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 09/10/14 19:43
aaa
09/10/14 20:53
nessuno
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à.
09/10/14 23:32
stichtom
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...
aaa
10/10/14 7:55
nessuno
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à.
13/10/14 17:28
pbe
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?
aaa
12/01/15 14:10
pbe
Se interessa ancora ecco la soluzione che ho trovato:

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 12/01/15 14:11
aaa
12/01/15 17:51
orsobimbo
Ciao approfitto anche io per dire la mia :D

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


// 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 :noway:

Ultima modifica effettuata da orsobimbo 12/01/15 18:06
aaa
12/01/15 18:33
orsobimbo
Postato originariamente da pbe:

Se interessa ancora ecco la soluzione che ho trovato:

.........................
La riga "scanf ("%*[^\n]";);" ha circa la stessa funzione del fflush()


Se ho capito bene non con "^" esclude il newline

en.cppreference.com/w/cpp/io/c/…
Ultima modifica effettuata da orsobimbo 12/01/15 18:34
aaa