getline не просит ввода?

Это, наверное, очень простая проблема, но простить меня, поскольку я новичок. Вот мой код:

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

Проблема в том, что когда его спросили, how much is that jacket? getline не запрашивает у пользователя ввода и просто вводит начальное значение «0». Почему это?

Вы должны быть осторожны при смешивании operator>> с getline . Проблема заключается в том, что при использовании operator>> пользователь вводит свои данные, а затем нажимает клавишу ввода, которая помещает символ новой строки во входной буфер. Поскольку operator>> пробел пробел, символ новой строки не помещается в переменную, и он остается во входном буфере. Затем, когда вы вызываете getline , символ новой строки – это единственное, что он ищет. Поскольку это первое, что есть в буфере, оно находит то, что оно ищет сразу, и никогда не нужно запрашивать пользователя.

Исправление: если вы собираетесь называть getline после того, как вы используете operator>> , вызовите игнорировать между ними или сделайте что-нибудь еще, чтобы избавиться от этого символа новой строки, возможно, фиктивный вызов getline .

Другой вариант, и это в соответствии с тем, о чем говорил Мартин, заключается в том, чтобы вообще не использовать operator>> и использовать только getline , а затем преобразовывать ваши строки в любой тип данных, который вам нужен. Это имеет побочный эффект, делая ваш код более безопасным и надежным. Сначала я бы написал такую ​​функцию:

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

Вы можете создать аналогичную функцию для float, double и других вещей. Тогда, когда вам нужно в int, вместо этого:

 cin >> i; 

Ты делаешь это:

 i = getInt(cin); 

Игнорируйте некоторые символы до тех пор, пока не будет достигнут фид.

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

Это потому, что у вас есть '\n' слева, лежащий на входном streamе от предыдущего вызова.

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

Самый простой способ сделать интерактивный пользовательский ввод – убедиться, что каждая строка обрабатывается независимо (поскольку пользователь нажимает кнопку ввода после каждого запроса).

В результате всегда читайте строку, затем обрабатывайте строку (пока вы не познакомитесь с streamами).

 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"; } 
Давайте будем гением компьютера.