PDA

View Full Version : [c++] odiatissimo buffer di input


Vecchia Spugna
21-05-2007, 22:01
Salve a tutti.
sono sull'orlo di una crisi di nervi. per quanto mi sforzi di rendere sicuro l'input da tastiera, arrivando a fare il controllo su ogni carattere, ogni tanto, apparentemente senza regole, mi si presentano situazioni tipo questa:

# 6

inserito: " 6 "
Inserisci ID da cancellare
#
inserito: " 3 "

dove ciò che segue # è l'input che il programma si aspetta. come potete vedere non ho dato nessun input e il programma ha preso arbitrariamente "3" senza che io digitassi niente.

la funzione che utilizzo per fare l'input è questa

int input::inputIntero(void)
{
int res;
char tempor;
cout << "# ";
char ris[20];
int i=0;
for(char s[20];!isdigit(s[0]);)
{
if(i!=0)
{
cout << "Errore: digita un numero intero\n# ";
}
tempor = getchar();
s[0] = tempor;
for(int j=1;tempor != '\n';j++)
{
tempor = getchar();
s[j] = tempor;
}
strcpy(ris, s);
i++;
}
res = atoi(ris);

#ifdef INPUTDEBUG
cout << "\ninserito: \" " << res << " \"" << endl;
#endif

return res;
}


utilizzo sempre e solo questa per qualsiasi input da console.

ho provato fflush(stdin) ma non funziona

cionci
21-05-2007, 23:59
Se quello che volevi fare era evitare che il programma si impallasse inserendo una stringa al posto di un numero, allora puoi fare così:

#include <iostream>

using namespace std;

int main()
{
int a;

while(1)
{
cin.clear();
cout << "Inserisci un numero: ";
cin >> a;

//se non ha fallito la lettura esco dal ciclo
if(!cin.fail())
break;

cout << "Devi inserire un numero intero" << endl;

//devo svuotare il buffer di ingresso
//prima lo rendo nuovamente valido
cin.clear();
//poi lo svuoto leggendo tutti i caratteri fino all'invio
while(cin.get() != '\n');
}

return 0;
}