我试图从控制台获取一些用户输入参数,两个字符串,两个整数和一个双精度。我正在尝试使用的相关代码是这样的:
#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 许可协议
问题是您正在使用运算符 >> 混合对 getline() 的调用。
请记住,运算符 >> 忽略了前导空格,因此将正确地跨行边界继续。但是在成功检索输入后停止读取,因此不会吞下尾随的 ‘\n’ 字符。因此,如果您在 >> 之后使用 getline(),除非您小心(首先删除未读取的 ‘\n’ 字符),否则您通常会得到错误的结果。
诀窍是不要同时使用这两种类型的输入。选择合适的并坚持下去。
如果它是所有数字(或与运算符 >> 配合得很好的对象),那么只需使用运算符 >>(注意字符串是唯一与输入/输出不对称的基本类型(即不能很好地发挥作用))。
如果输入包含字符串或需要 getline() 的内容组合,则仅使用 getline() 并从字符串中解析出数字。