PDA

Visualizza la versione completa : [C/C++]Gestione dell'input..


Marco1995
25-02-2013, 14:13
Salve ragazzi..premetto che ho provato a cercare un pò in giro per la rete ed ho trovato dei risultati,ma molto confusi :confused:
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):



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 :D
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:


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 (http://www.cplusplus.com/reference/cstdio/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 :dhò: perciò chiedo a voi.
Non è che riuscireste a darmi una mano?
P.s.Mi interesserebbe anche sapere una soluzione in C++ :D

Grazie in anticipo :ciauz:

oregon
25-02-2013, 14:46
Nel primo codice basta scrivere



if (i==0)
{
printf("\nInput non valido!!\n");
while(getchar()!='\n');
}

Marco1995
25-02-2013, 17:59
Nel primo codice basta scrivere




if (i==0)
{
printf("\nInput non valido!!\n");
while(getchar()!='\n');
}



Complimenti..intendevo proprio così..ma puoi spiegarmi il perchè di


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


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?

MItaly
25-02-2013, 21:20
Originariamente inviato da Marco1995
Complimenti..intendevo proprio così..ma puoi spiegarmi il perchè di


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


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:


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

oppure


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).

Marco1995
25-02-2013, 21:31
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



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:



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



oppure



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 :)

MItaly
25-02-2013, 21:54
:ciauz:

Loading