Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250

    [C/C++]Gestione dell'input..

    Salve ragazzi..premetto che ho provato a cercare un pò in giro per la rete ed ho trovato dei risultati,ma molto confusi
    Il mio problema è il seguente:
    Prendere in input il numero;se "quello" immesso dall'utente è un numero allora prosegui a fare quello che devi fare altrimenti stampa un messaggio d'errore e rieffettua l'inserimentodel numero.

    Io ho provato a fare in questo modo (in c):
    codice:
    int main()
    {
    //Codice trovato in rete
    	int n = 0,i = 0;
    	do
    	{
    			printf ("Inserisci un numero valido ");
    			i = scanf("%d",&n);
    			if (i==0)
    				printf("\nInput non valido!!\n");
    	}
    	while(i==0);
    	
    	
    }
    Ovviamente il suddetto codice non funziona perchè se inserisco anche solo un singolo carattere il programma mi entra in loop.

    Ok ragazzi però non ho perso le speranze
    Ho provato a fare un altro ragionamento:
    ho supposto che la scanf ritorni uno 0 se fallisce,mentre se non fallisce un valore diverso da 0. (chiedo conferma se quanto ho supposto è giusto)
    Quindi ho fatto una cosa di questo tipo:
    codice:
    int main()
    {
    	int n = 0;
    	do
    	{
    			printf ("Inserisci un numero valido ");
    			if (! scanf("%d",&n))
    			   printf("\nInput non valido!!\n");
    	}
    	while(! scanf("%d",&n));
    	
    	
    }
    Ma a malincuore entra in loop anche in questo caso.
    Guardando la reference della scanf non riesco a capire proprio cosa ritorna la scanf.
    Conclusione:
    Ci provo a studiare e a documentarmi in modo autonomo ma a volte proprio non mi riesce perciò chiedo a voi.
    Non è che riuscireste a darmi una mano?
    P.s.Mi interesserebbe anche sapere una soluzione in C++

    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Nel primo codice basta scrivere

    codice:
    	if (i==0)
    	{
    		printf("\nInput non valido!!\n");
    		while(getchar()!='\n');
    	}
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Nel primo codice basta scrivere

    codice:
    	if (i==0)
    	{
    		printf("\nInput non valido!!\n");
    		while(getchar()!='\n');
    	}
    Complimenti..intendevo proprio così..ma puoi spiegarmi il perchè di
    codice:
    while(getchar()!='\n');
    In pratica ignora tutti i caratteri finchè non viene premuto l'invio?Perchè è necessario ignorarli?

    Inoltre ho provato a fare la stessa cosa con cin (C++)...però nella riga in cui faccio
    codice:
    i = cin >> n; //ho provato anche a mettere i = (cin >> n)
    mi dice "Invalid conversion from void to int"...
    Ho provato ad esplicitare un cast..ma mi da errore dicendomi in pratica che non posso "castare" ..

    Forse non è questa la strada da adottare..suggerimenti?

  4. #4
    Originariamente inviato da Marco1995
    Complimenti..intendevo proprio così..ma puoi spiegarmi il perchè di
    codice:
    while(getchar()!='\n');
    In pratica ignora tutti i caratteri finchè non viene premuto l'invio?Perchè è necessario ignorarli?
    Perché se scanf non riesce a convertire dei caratteri forniti in input nel formato specificato, i caratteri in questione rimangono nel buffer di input. Il ciclo in questione scarta tutti i caratteri rimanenti sulla riga, il che consente di ripartire con un buffer "pulito".
    Inoltre ho provato a fare la stessa cosa con cin (C++)...però nella riga in cui faccio
    codice:
    i = cin >> n; //ho provato anche a mettere i = (cin >> n)
    mi dice "Invalid conversion from void to int"...
    Ho provato ad esplicitare un cast..ma mi da errore dicendomi in pratica che non posso "castare" ..

    Forse non è questa la strada da adottare..suggerimenti?
    l'operatore >> di istream restituisce lo stream stesso (altrimenti non sarebbe possibile concatenare più estrazioni con >>). Per verificare se l'estrazione di un valore è fallita puoi controllare il valore restituito dal metodo fail(). L'equivalente di quel ciclo di prima può essere:
    codice:
    while(cin.get()!='\n');
    oppure
    codice:
    cin.ignore(numeric_limits<streamsize>::max(), '\n' );
    Questo secondo metodo ha il vantaggio di evitare di andare in loop se lo stream di input termina o va in errore (si può comunque aggiustare anche l'altro metodo).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Perché se scanf non riesce a convertire dei caratteri forniti in input nel formato specificato, i caratteri in questione rimangono nel buffer di input. Il ciclo in questione scarta tutti i caratteri rimanenti sulla riga, il che consente di ripartire con un buffer "pulito".

    Inoltre ho provato a fare la stessa cosa con cin (C++)...però nella riga in cui faccio
    codice:
    i = cin >> n; //ho provato anche a mettere i = (cin >> n)
    mi dice "Invalid conversion from void to int"...
    Ho provato ad esplicitare un cast..ma mi da errore dicendomi in pratica che non posso "castare" ..

    Forse non è questa la strada da adottare..suggerimenti?
    l'operatore >> di istream restituisce lo stream stesso (altrimenti non sarebbe possibile concatenare più estrazioni con >> ). Per verificare se l'estrazione di un valore è fallita puoi controllare il valore restituito dal metodo fail(). L'equivalente di quel ciclo di prima può essere:

    codice:
    while(cin.get()!='\n');

    oppure
    codice:
    cin.ignore(numeric_limits<streamsize>::max(), '\n' );
    Questo secondo metodo ha il vantaggio di evitare di andare in loop se lo stream di input termina o va in errore (si può comunque aggiustare anche l'altro metodo).
    Grazie..chiarissimo

  6. #6
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.