PDA

Visualizza la versione completa : [c++] input saltato...


zannas
28-12-2011, 20:04
Salve gente, per semplificarmi la vita mi sono creato 2 funzioni:


template <class tipo>
void keyb_set(tipo &var){
std::string str;
std::getline(std::cin,str);
if (str == "exit" or str == "EXIT"){
exit(0);
}
std::stringstream(str)>>var;
}

void keyb_set(std::string &str){
std::cin>>str;
if (str == "exit" or str == "EXIT") {
exit(0);
}
}


il fatto è che se faccio un programma dove faccio:


int n;
int n1;
string s;

keyb_set(s);

..operazioni..

keyb_set(n); //questa operazione viene saltata!!! n si prende il valore di 0 e Da qui torna a funzionare!

..operazioni...

keyb_set(n1); //funziona..

come mai? com'è possibile?

MItaly
28-12-2011, 20:53
Per caso poco prima hai una normale cin>>qualcosa?

zannas
28-12-2011, 21:05
no ma dentro ....operazioni... compreso tra keyb_set(s) e keyb_set(n) ho 3 richiami a una funzione che al suo interno ha:

std::stringstream(str)>>var; con var che è un double...

comunque non dovrebbe centrare perchè commentando tutto tranne le parti dove ho keyb_set(s) e keyb_set(n) si comporta allo stesso modo..

shodan
28-12-2011, 23:04
Usa sempre la std::getline.


void keyb_set(std::string &str){
std::getline(std::cin,str);
if (str == "exit" or str == "EXIT") {
exit(0);
}
}


Gli operatori >> di std::cin sono qualcosa di osceno. :incupito:

zannas
28-12-2011, 23:09
oh... con getline sembra funzionare... :) sembra... ora testo :ciauz:

MItaly
28-12-2011, 23:11
Originariamente inviato da shodan
Gli operatori >> di std::cin sono qualcosa di osceno. :incupito:
Espando: gli operatori >> saltano automaticamente il whitespace all'inizio e lasciano il token su cui si sono fermati (in genere il newline) nel buffer, il che significa che se usi solo loro non c'è problema, ma se mischi input formattato (>>) e non formattato (getline) iniziano ad esserci problemi, perché il newline lasciato giù da >> fa da terminatore per la successiva chiamata a getline.

shodan
28-12-2011, 23:21
Personalmente ho preferito deprecare gli >> e acquisisco ogni input da tastiera e/o file tramite std::getline() e poi convertire, se necessario, con std::istringstream.
Almeno non do di matto con i problemi riscontrati dall'OP.

Loading