c getline() 在多次调用时不等待来自控制台的输入

新手上路,请多包涵

我试图从控制台获取一些用户输入参数,两个字符串,两个整数和一个双精度。我正在尝试使用的相关代码是这样的:

 #include <string>
#include <iostream>
using namespace std;

// ...

string inputString;
unsigned int inputUInt;
double inputDouble;

// ...

cout << "Title: ";
getline(cin, inputString);
tempDVD.setTitle(inputString);

cout << "Category: ";
getline(cin, inputString);
tempDVD.setCategory(inputString);

cout << "Duration (minutes): ";
cin >> inputUInt;
tempDVD.setDuration(inputUInt);

cout << "Year: ";
cin >> inputUInt;
tempDVD.setYear(inputUInt);

cout << "Price: $";
cin >> inputDouble;
tempDVD.setPrice(inputDouble);

但是,在运行程序时,不是等待输入第一个 inputString,而是在第二个 getline() 调用之前代码不会停止。因此控制台输出如下所示:

标题: 类别:

光标出现在类别之后。如果我现在输入,程序会跳转到年份输入,不允许我输入多个字符串。这里发生了什么事?

原文由 user754852 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

问题是您正在使用运算符 >> 混合对 getline() 的调用。

请记住,运算符 >> 忽略了前导空格,因此将正确地跨行边界继续。但是在成功检索输入后停止读取,因此不会吞下尾随的 ‘\n’ 字符。因此,如果您在 >> 之后使用 getline(),除非您小心(首先删除未读取的 ‘\n’ 字符),否则您通常会得到错误的结果。

诀窍是不要同时使用这两种类型的输入。选择合适的并坚持下去。

如果它是所有数字(或与运算符 >> 配合得很好的对象),那么只需使用运算符 >>(注意字符串是唯一与输入/输出不对称的基本类型(即不能很好地发挥作用))。

如果输入包含字符串或需要 getline() 的内容组合,则仅使用 getline() 并从字符串中解析出数字。

 std::getline(std::cin, line);
std::stringstream  linestream(line);

int  value;
linestream >> value;

// Or if you have boost:
std::getline(std::cin, line);
int  value = boost::lexical_cast<int>(line);

原文由 Martin York 发布,翻译遵循 CC BY-SA 3.0 许可协议

也适用于 ws 。您可以使用 getline(cin >> ws, inputString) )在使用 cin 命令读取数据后吃掉空格或换行符。

原文由 Osman Coskun 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题