在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
之后使用ignore
stream是一个经常推荐的替代方法来丢弃到下一个换行符的内容,但是它有可能丢掉非空白的内容,这样做可以忽略文件中的损坏数据。 您可能会也可能不会在意,这取决于文件内容的可信度,避免处理损坏的数据的重要性等。
那么你什么时候使用明确而忽略?
因此, 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
设置为1
, E6
读作为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
的内部缓冲区。 如果是这样的话:忽略它(基本上跳过它)