gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:54:37 35 4
gpt4 key购买 nike

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

#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() 调用之前代码不会停止。因此控制台输出如下所示:

Title: Category:

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

最佳答案

问题是您将 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);

关于c++ getline()在多次调用时不等待来自控制台的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7786994/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com