getline fragt nicht nach Eingabe?

Dies ist wahrscheinlich ein sehr einfaches Problem, aber vergib mir, wie ich neu bin. Hier ist mein Code:

#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; } 

Das Problem ist, dass wenn gefragt, how much is that jacket? getline fragt den Benutzer nicht nach Eingabe und gibt nur den Anfangswert “0” ein. Warum ist das?

Sie müssen vorsichtig sein, wenn Sie operator>> mit getline . Das Problem ist, wenn Sie den operator>> , gibt der Benutzer seine Daten ein und drückt dann die Eingabetaste, die ein Zeilenvorschubzeichen in den Eingabepuffer legt. Da operator>> Whitespace begrenzt ist, wird das Newline-Zeichen nicht in die Variable eingefügt und verbleibt im Eingabepuffer. Dann, wenn Sie getline , ist ein Newline-Zeichen das einzige Ding, das es sucht. Da dies das erste Element im Puffer ist, findet es sofort, wonach es sucht, und muss den Benutzer nie auffordern.

Fix: Wenn du getline aufrufen getline nachdem du operator>> hast, rufe ignoriere dazwischen auf, oder mach etwas anderes, um dieses newline-Zeichen loszuwerden, vielleicht einen Dummy-Aufruf an getline .

Eine andere Option, und das ist im Sinne von dem, worüber Martin gesprochen hat, ist, operator>> überhaupt nicht zu verwenden und nur getline , dann wandeln Sie Ihre Strings in den von Ihnen benötigten Datentyp um. Dies hat den Nebeneffekt, dass Ihr Code sicherer und robuster wird. Ich würde zuerst eine function wie folgt schreiben:

 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; */ } 

Sie können eine ähnliche function für Floats, Doubles und andere Dinge erstellen. Dann, wenn Sie in int brauchen, anstatt:

 cin >> i; 

Du machst das:

 i = getInt(cin); 

Ignorieren Sie einige Zeichen, bis der Zeilenvorschub erreicht ist.

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

Das liegt daran, dass Sie ein '\n' im Eingabestream eines vorherigen Aufrufs liegen haben.

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

Der einfachste Weg, interaktive Benutzereingaben zu machen, besteht darin, sicherzustellen, dass jede Zeile unabhängig verarbeitet wird (da der Benutzer nach jeder Eingabeaufforderung die Eingabetaste drücken wird).

Lesen Sie daher immer eine Zeile und bearbeiten Sie die Zeile (bis Sie sich mit den Streams vertraut gemacht haben).

 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"; }