在cin之后使用getline(cin,s)

我需要下面的程序来获取用户input的全部内容,并将其input到string名称中:

cout << "Enter the number: "; int number; cin >> number; cout << "Enter names: "; string names; getline(cin, names); 

然而,在getline()命令之前使用cin >> number命令(我猜是这个问题),它不会允许我input名字。 为什么?

我听说过一个cin.clear()命令,但我不知道这是如何工作的,或者为什么这是必要的。

 cout << "Enter the number: "; int number; if (cin >> number) { // throw away the rest of the line char c; while (cin.get(c) && c != '\n') if (!std::isspace(c)) { std::cerr << "ERROR unexpected character '" << c << "' found\n"; exit(EXIT_FAILURE); } cout << "Enter names: "; string name; // keep getting lines until EOF (or "bad" eg error reading redirected file)... while (getline(cin, name)) ...use name... } else { std::cerr << "ERROR reading number\n"; exit(EXIT_FAILURE); } 

在上面的代码中,这一点…

  char c; while (cin.get(c) && c != '\n') if (!std::isspace(c)) { std::cerr << "ERROR unexpected character '" << c << "' found\n"; exit(EXIT_FAILURE); } 

…在数字只包含空格之后检查input行的其余部分。

为什么不使用忽略?

这是相当详细的,所以在>> x之后使用ignorestream是一个经常推荐的替代方法来丢弃到下一个换行符的内容,但是它有可能丢掉非空白的内容,这样做可以忽略文件中的损坏数据。 您可能会也可能不会在意,这取决于文件内容的可信度,避免处理损坏的数据的重要性等。

那么你什么时候使用明确而忽略?

因此, std::cin.clear() (和std::cin.igore() )不是必需的,但对于删除错误状态很有用。 例如,如果你想给用户很多机会input一个有效的号码。

 int x; while (std::cout << "Enter a number: " && !(std::cin >> x)) { if (std::cin.eof()) { std::cerr << "ERROR unexpected EOF\n"; exit(EXIT_FAILURE); } std::cin.clear(); // clear bad/fail/eof flags // have to ignore non-numeric character that caused cin >> x to // fail or there's no chance of it working next time; for "cin" it's // common to remove the entire suspect line and re-prompt the user for // input. std::cin.ignore(std::numeric_limits<std::streamsize>::max()); } 

不能用skipws或类似的简单吗?

另一个简单的,但一半的替代ignore您的原始要求是使用std::skipws在读取行之前跳过任何数量的空格…

 if (std::cin >> number >> std::skipws) { while (getline(std::cin, name)) ... 

…但是如果它input像“1E6”(例如一些科学家试图input1,000,000,但C ++只支持浮点数的符号)将不会接受,最终将number设置为1E6读作为name的第一个值。 另外,如果你有一个有效的数字后跟一个或多个空白行,这些行将被默默地忽略。

 cout << "Enter the number: "; int number; cin >> number; cin.ignore(256, '\n'); // remaining input characters up to the next newline character // are ignored cout << "Enter names: "; string names; getline(cin, names); 

另一种做法是把一个

 cin.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); 

你的cin>>number; 完全刷新input缓冲区(拒绝所有的额外字符,直到find换行符)。 你需要#include <limits>来获取max()方法。

尝试:

 int number; cin >> number; char firstCharacterOfNames; cin >> firstCharacterOfNames; // This will discard all leading white space. // including new-line if there happen to be any. cin.unget(); // Put back the first character of the name. std::string names; std::getline(cin, names); // Read the names; 

另外。 如果你知道号码和姓名总是在不同的行。

 cin >> number; cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::getline(cin, names); 

在使用getline之前,可以使用std :: ws在input缓冲区中提取任何空格字符。 std :: ws的头文件是sstream。

 cout << "Enter the number: "; int number; cin >> number; cout << "Enter names: "; string names; cin>>ws; getline(cin, names); 

或者你可以刷新input缓冲区来读取string

fflush(标准input)

它在头文件stdio.h中定义。

这个代码工作..

 cout << "Enter the number: "; int number; cin >> number; cout << "Enter names: "; string names; fflush(stdin); //FLUSHING STDIN getline(cin, names); 

你可以在cppreference中find你想要的答案。

在空格分隔input之后立即使用,例如在int n; std::cin >> n; int n; std::cin >> n; ,getline消耗操作符>>留在inputstream上的结束字符,并立即返回。 一个常见的解决scheme是用cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');忽略input行上的所有剩余字符cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 在切换到面向行的input之前。

你想在你的cin语句之后使用cin.ignore(),因为你想在用cin取得你的intvariables后忽略缓冲区中的“\ n”。

我有一个类似的问题:

 #include <iostream> #include <iomanip> #include <limits> using namespace std; int main() { int i = 4; double d = 4.0; string s = "HackerRank "; // Declare second integer, double, and String variables. int n; double d2; string str; // Read and save an integer, double, and String to your variables. cin >> n; cin >> d2; cin.ignore(); getline(cin, str); // Print the sum of both integer variables on a new line. cout << i + n << endl; // Print the sum of the double variables on a new line. cout << d + d2 << endl; // Concatenate and print the String variables on a new line cout << s << str << endl; // The 's' variable above should be printed first. return 0; } 

我刚刚使用

 getline(cin >> ws,lard.i_npute); 

与标准

 #include <iostream> 

标题在我遇到回车问题和ws操纵器的情况下。 我可能会开始embedded循环函数作为类和使用构造函数和析构函数调用atleast。

从概念上讲,我认为你希望每个答案都整齐一行。 那么你为什么不尝试这个?

 cout << "Enter the number: "; string line; getline(cin, line); int number = std::stoi(line); cout << "Enter names: "; string names; getline(cin, names); 

该代码正确使用第一个换行符,如果该行正确,则为您提供数字,如果不是,则会引发exception。 全部免费!

 #include <iostream> #include <string> using namespace std; int main() { cout << "Enter the number: "; int number; cin >> number; cout << "Enter names: "; string names; // USE peek() TO SOLVE IT! ;) if (cin.peek() == '\n') { cin.ignore(1 /*numeric_limits<streamsize>::max()*/, '\n'); } getline(cin, names); return 0; } 

只要看看使用cin.peek() ,看看'\n'是否仍然留在cin的内部缓冲区。 如果是这样的话:忽略它(基本上跳过它)