getline non chiedendo input?

Questo è probabilmente un problema molto semplice, ma perdonami come sono nuovo. Ecco il mio codice:

#include  #include  #include  using namespace std; int main () { string name; int i; string mystr; float price = 0; cout << "Hello World!" << endl; cout <> name; cout << "Hello " << name << endl; cout <> i; cout << "Wow " << i << endl; cout <> price; cout << price << endl; system("pause"); return 0; } 

Il problema è che quando viene chiesto how much is that jacket? getline non chiede l’input all’utente e inserisce solo il valore iniziale di “0”. Perchè è questo?

Devi stare attento quando mischi l’ operator>> con getline . Il problema è che quando si utilizza l’ operator>> , l’utente inserisce i propri dati, quindi preme il tasto Invio, che inserisce un carattere di nuova riga nel buffer di input. Poiché operator>> è delimitato da spazi bianchi, il carattere di nuova riga non viene inserito nella variabile e rimane nel buffer di input. Quindi, quando chiami getline , un personaggio newline è l’unica cosa che sta cercando. Poiché è la prima cosa nel buffer, trova subito ciò che sta cercando e non ha mai bisogno di chiedere all’utente.

Correzione: se si chiamerà getline dopo aver usato l’ operator>> , chiama ignore in mezzo, o fai qualcos’altro per sbarazzarsi di quel carattere di fine riga, forse una chiamata fittizia a getline .

Un’altra opzione, e questa è sulla falsariga di ciò di cui parlava Martin, è di non usare affatto l’ operator>> e di usare solo getline , quindi convertire le stringhe in qualunque tipo di dati sia necessario. Questo ha un effetto collaterale nel rendere il tuo codice più sicuro e robusto. Per prima cosa scrivo una funzione come questa:

 int getInt(std::istream & is) { std::string input; std::getline(is,input); // C++11 version return stoi(input); // throws on failure // C++98 version /* std::istringstream iss(input); int i; if (!(iss >> i)) { // handle error somehow } return i; */ } 

Puoi creare una funzione simile per float, double e altre cose. Quindi quando hai bisogno di int, invece di questo:

 cin >> i; 

Tu lo fai:

 i = getInt(cin); 

Ignora alcuni caratteri finché non viene raggiunto l’avanzamento riga.

 cin.ignore(256, '\n') getline (cin,mystr); 

È perché hai una '\n' sinistra situata sul stream di input da una precedente chiamata.

 cin >> i; // This reads the number but the '\n' you hit after the number // is still on the input. 

Il modo più semplice per eseguire l’input dell’utente interattivo è assicurarsi che ogni riga sia elaborata in modo indipendente (dato che l’utente preme Invio dopo ogni prompt).

Di conseguenza, leggi sempre una riga, quindi elabora la linea (finché non acquisisci familiarità con i flussi).

 std::string line; std::getline(std::cin, line); std::stringstream linestream(line); // Now processes linestream. std::string garbage; lienstream >> i >> garbage; // You may want to check for garbage after the number. if (!garbage.empty()) { std::cout < < "Error\n"; }