PDA

Visualizza la versione completa : C++ Controllo inserimento "forzato"....


MarkRed
19-03-2012, 12:11
Salve a tutti!

premetto che sono alle prime armi con questo stupendo linguaggio di programazzione.
Per il momento, mi sto cimentando e sperimentando con degli esercizi, con l'IDE Dev, applicazioni console.

Vi chiedo:

tramite CIN e/o SCANF, è possibile OBBLIGARE il tipo di inserimento, ad esempio se è solo un numero o un carattere oltre ad OBBLIGARE, quanto meno riconoscere, in particolari situazioni, non oltre, ad esempio, un solo carattere e/o numero.

Mi spiego meglio:

ipotizziamo che CIN e/o SCANF, sono in attesa d'inserimento di una 'S' o 'N', per poter continurare il programma o abbandonarlo, ho notato che se inserisco qualche carattere di troppo, la CIN/SCANF ripete la richiesta tante volte quanti caratteri e/o numeri, erroneamente inseriti - abbastanza fastidioso, stesso discorso se sono in attesa di solo numeri e, in questo caso, erroneamente si inserisce uno o più caratteri, va letteralmente in palle.

Spero di essere stato abbastanza chiaro e anticipatamente ringrazio per l'attenzione.
Marco.

ramy89
19-03-2012, 12:55
Originariamente inviato da MarkRed
Salve a tutti!
Mi spiego meglio:

ipotizziamo che CIN e/o SCANF, sono in attesa d'inserimento di una 'S' o 'N', per poter continurare il programma o abbandonarlo, ho notato che se inserisco qualche carattere di troppo, la CIN/SCANF ripete la richiesta tante volte quanti caratteri e/o numeri, erroneamente inseriti [...]


Questo se la scanf si trova in un ciclo, ma dipende dal codice.
La scanf di per se con %c prende in input un carattere, e ne viene letto uno solo.
Se chiedi in input una stringa tramite l' operatore << di cin:



string str;
cin >> str;


Qualsiasi sequenza di caratteri inserita viene considerata valida, perchè anche "123" è una stringa.L' unica cosa che puoi fare te è inserire questo codice in un ciclo, ed eventualmente ripetere il controllo se secondo te l' input non è valido:



string str;
do
{
cin >> str;
}while(str!="S" && str!="N");

MarkRed
19-03-2012, 13:55
Grazie per il suggerimento.
Dunque, ho trasformato risposta da - char risposta a string risposta e funziona egregiamente, nel senso che quasiasi cosa inserisca, superando la lunghezza di oltre un carattere, rinnova l'invito inserimento correttamente, solo che ora non funziona - risposta=toupper(risposta) perchè credo che esista solo nel "char" e non ho ancora trovato il corrispondente in "string".

Resta ancora il problema, avendo dichiarato int variabile numerica intera, che l'invito tramite cout e lettura da cin, ad inserire uno e solo un numero e se erroneamente inserisco tutt'altro che un numero, il programma va proprio "in palle".

Grazie dell'attenzione.
Marco.

ramy89
19-03-2012, 18:48
Originariamente inviato da MarkRed
[...] solo che ora non funziona - risposta=toupper(risposta) perchè credo che esista solo nel "char" e non ho ancora trovato il corrispondente in "string".


Devi usare la funzione toupper su tutti i caratteri della stringa:



for(unsigned int i=0;i<str.size();i++)
str[i]=toupper(str[i]);




Resta ancora il problema, avendo dichiarato int variabile numerica intera, che l'invito tramite cout e lettura da cin, ad inserire uno e solo un numero e se erroneamente inserisco tutt'altro che un numero, il programma va proprio "in palle".


Prova e vedi che succede.

MarkRed
20-03-2012, 20:53
Ok!!! Grazie per il suggerimento :-)

Il "maiuscolo" l'ho risolto, adesso provo con l'inserimento "forzato", nel caso di numeri, che l'utente non inserisca, erroneamente, tutt'altro che interi.

Eventualmente, mi faccio "rivedere".
Grazie per l'attenzione.
Marco.

P.S. - anche se non è bello un "copia e incolla" - devo capire, ancora studiando, il significato e il perchè di UNSIGNED.

ramy89
20-03-2012, 22:13
Originariamente inviato da MarkRed
P.S. - anche se non è bello un "copia e incolla" - devo capire, ancora studiando, il significato e il perché di UNSIGNED.

Ho usato l' unsigned int perche il metodo size() restituisce un tipo unsigned int, ma avrei potuto anche dichiararlo int, che è compatibile ma è proprio per essere pignoli. Perché certi compilatori danno un warning se confronti un int con un unsigned int.

Loading