PDA

View Full Version : [C++] problema con CIN


pagliaccino77
04-09-2002, 18:14
ciao ragazzi,

in una parte, e solo in quella, devo mettere due cin altrimenti mi salta la chiamata, come se non l'avessi scritto!

ecco:

nel main c'e':

cliente nuovo;
nuovo.crea();

e nelle classe cliente:

void cliente::crea(){
cout<<endl<<"CLIENTE"<<endl;
cout<<"Nome : "
Stringa<50> nn;
cin>>nn;// PROBLEMA !!!!!
cin>>nn;
nome_cliente=nn;
cout<<"Codice: ";
int c;
cin>>c;
codice_cliente=c;

};

praticamente se non metto il secondo cin mi passa subito a codice.

E' strano, non capisco, dove sbaglio?

come rimedio?

grazie

cionci
05-09-2002, 09:50
Non è che il problema è prima ? Magari nello stdin hai già qualche Invio...

prova a mettere un cin.ignore() all'inzio della funzione...

pagliaccino77
05-09-2002, 10:49
okay

grazie

funziona ora

anche se non sono riuscito a capire dove sbagliavo
....

alla prox

cionci
05-09-2002, 12:34
Originariamente inviato da pagliaccino77
[B]okay

grazie

funziona ora

anche se non sono riuscito a capire dove sbagliavo
....

alla prox
Ti restava un carattere nello stdin...usavi qualche funzione che non prelevava i caratteri dallo stdin tipo kbhit() ?

pagliaccino77
05-09-2002, 12:53
Originariamente inviato da cionci
[B]
Ti restava un carattere nello stdin...usavi qualche funzione che non prelevava i caratteri dallo stdin tipo kbhit() ?

avevo fatto cosi':

int main(){
bool esci=false;
int n;
while (!esci){
system("cls");
cout<<"(2) - Visualizza Archivio_clienti"<<endl;
cout<<"Inserisci la scelta desiderata e premi INVIO ";
cin<<n;
switch(n){
case 2: {
system("cls");
progetto.stampa_archivio_clienti();
premitasto();
break;
};


case 0: { esci=true;
break;
};


default: cout<<endl<<"ERRORE"<<endl;
};

};

return 0;
};

A dire il vero stavo cercando anche di evitare che premendo un carattere si verificassero problemi, una gestione degli errori che se si immette una stringa invece di un int segnala l'errore e continua....

tu che dici?

pagliaccino77
05-09-2002, 12:59
errata corrige

case 3: {
system("cls");
cliente nuovo;
nuovo.crea();
progetto.ins_cliente(nuovo);
premitasto();
break;};

cionci
05-09-2002, 14:31
Se il menù ha meno di 10 opzioni puoi usare cin.get() al posto di cin >> nn;
Per il resto ti faccio sapere...

cionci
05-09-2002, 14:49
Questo dovrebbe fare al caso tuo...

#include <iostream>
#include <string>

using namespace std;

int leggiIntero(int &c)
{
string s;
cin >> c;
if(cin.fail())
{
cin.clear();
cin >> s;
cout << "\nerrore\n\n";
return 0;
}
return 1;
}

void main()
{
int c;
while(!leggiIntero(c));
}

pagliaccino77
05-09-2002, 16:34
ok, ti ringrazio tantissimo

ho creato 3 funzioni del tipo

prendi(n)

dove n puo' essere int,long,unsigned e le ho sostituite a tutti i cin (che poi erano pochi), tutto va bene, tranne una cosa:

se si immette una stringa che inizia per un numero tipo

4gdfgfdgdfs

mi prende 4 come intero e alla successiva richiesta di leggi() oppure di cin>>stringa mi ci riversa gdfgfdgdfs.

cmq non voglio darti noie ulteriori, il programma adesso è un tantino meno fragile e questo lo devo a te, qual è il tuo # di c.c.? ;-)

:D :D :D :p

alla prox, spero che allora sia io ad aiutarti...magari in altri campi :cool:

a presto

:)

cionci
05-09-2002, 17:32
Per l'altra situazione sinceramente non saprei come fare...

Comunque è stato un piacere...

Ciao :)