|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jun 2007
Messaggi: 2
|
[C++]Su MsDos-Un piccolo aiuto-Controllo del tipo
Raga ho un piccolo problema
ho compilato un programma in c++ che consente di trovare in una matrice le righe e le colonne a somma massima e a somma minima..fin quì tutto ok ..questo era un programmma da consegnare al professore di elementi di informatica..e mi disse già a suo tempo che andava bene..due giorni fà mi ha mandato l'e-mail e mi ha detto che sarebbe stato meglio se avessi inserito il controllo sul tipo per impedire cioè l'inserimento del carattere ed io ho inserito questo semplice ciclo di while che mezzo lho trovato su internet mezzo lho fatto io..FUNZIONA! l'unico problema è che nn ho capito xchè il ciclo dichiari il carattere Z e poi abbia cin>>z...nn lho capito anche xchè compilando e facndo partire il programma il carattere z nn viene richiesto!!..io ho provato a togliere questa parte del ciclo...ma senza impazzisce..qualcuno di voi sa a cosa serva? ecco il ciclo while(cin.fail()) { cin.clear(); char z; cin>>z; cout<<"\n ERRORE!!"; cout<<"\n Reinserisci il valore della scelta!"; cin>>def; } Vi prego! Mi salvereste la vita.... |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Aug 2000
Messaggi: 608
|
Quote:
Infatti, dopo aver resettato il canale di input con cin.clear(), rimane ancora in sospeso il '\n' di invio dall'inserimento precedente (quando si è inserito il carattere generando il fail), quindi lo si "svuota" con quel cin >> z. In pratica, per dirla in soldoni, serve soltanto a togliere dalle scatole quel '\n' residuo in modo tale che alla successiva operazione di input il canale sia bello libero. Infatti, se togli quell'operazione il programma si comporta in modo strano, dal momento che non è stato svuotato il buffer dopo il reset con cin.clear(). Volendo, però, non hai bisogno di utilizzare la variabile z. Basta che sostituisci quel cin >> z con: while (cin.get()!='\n'); in questo modo ottieni lo svuotamento completo del buffer del canale cin, ma senza la necessità di usare una variabile. Inoltre, questo ciclo svuota completamente il buffer, mentre l'operazione cin >> z toglie solamente 1 carattere, lasciandoti nei guai se nel buffer ce ne fossero più di uno. Se ho detto delle vaccate qualcuno mi corregga ![]()
__________________
Intel Core2Quad Q6600 2,4GHz @ 3,0 GHz 2 Gb RAM 667 MHz ATI HD2900XT |
|
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Jun 2007
Messaggi: 2
|
Scusami la domanda...ho capito tutto tranne una cosa..cosa sia il '\n' di invio..nn dovrebbe essere un carattere speciale k causa l'andata a capo della stringa stampata a video e basta?
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Aug 2000
Messaggi: 608
|
Quote:
Se non togli quel '\n' con il ciclo di svuotamento del buffer dopo l'errore (e dopo aver resettato il cin con cin.clear()), alla successiva richiesta di input verrà preso automaticamente quel '\n', dal momento che sarà ancora in sospeso nel buffer, e la richiesta di input verrà "saltata" (perchè considerato "fine stringa") comportanto un malfunzionamento del programma. Ecco il motivo di svuotare il buffer dopo ogni errore del cin.
__________________
Intel Core2Quad Q6600 2,4GHz @ 3,0 GHz 2 Gb RAM 667 MHz ATI HD2900XT |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:44.