C++ cin.getline不执行c++;
出于某种奇怪的原因,我的输入行C++ cin.getline不执行c++;,c++,inputstream,getline,C++,Inputstream,Getline,出于某种奇怪的原因,我的输入行cin.getline(oneLine,80)放入这个else if块时,它被完全忽略。我不明白为什么,因为当我把它移到程序中的其他地方时,它就起作用了 else if (choice == "user-id") { cout << endl << "Enter a full name e.g. John Smith "; char oneLine[80]; cin.g
cin.getline(oneLine,80)当我将代码>放入这个else if块时,它被完全忽略。我不明白为什么,因为当我把它移到程序中的其他地方时,它就起作用了
else if (choice == "user-id")
{
cout << endl << "Enter a full name e.g. John Smith ";
char oneLine[80];
cin.getline(oneLine, 80);
cout << oneLine;
}
else if(选项==“用户id”)
{
cout您的std::cin
对象在以前的输入操作中处于错误状态(std::cin.good()==false
)。例如,您可能试图读取一个数字,但输入缓冲区中只有非数字字符
继续使用std::istream
注意:不要使用在char*
上运行的旧输入函数,因为它们比在std::string
上运行的新输入函数更复杂,使用起来更不安全。在您的情况下,请使用std::getline(std::istream&,std::string&,char='\n')
您的std::cin
对象处于错误状态(std::cin.good()==false
)来自以前的输入操作。例如,您可能试图读取一个数字,但输入缓冲区中只有非数字字符
继续使用std::istream
注意:不要使用在char*
上运行的旧输入函数,因为它们比在std::string
上运行的新输入函数更复杂,使用起来也更不安全。在您的情况下,请使用std::getline(std::istream&,std::string&,char='\n')
twsaef的评论实质上是正确的……您正在将一个字符串流式传输到choice中,该字符串将使用字符直到下一个空格字符,但不包括下一个空格字符-您可能正在键入一个新行来终止输入,因此它留在缓冲区中。然后使用getline查看该新行并读取一个空字符串
最简单的解决方案是调用getline()
来读取初始字符串,然后检查选项是“name\n”还是“user id\n”。最好在比较之前编写一个“trim”函数来删除行中的空白(boost字符串库已经有了这个选项)。否则,您可以使用read并忽略std::cin
中的字符,直到得到一个“\n”。或者甚至可以读取一行,然后放入字符串流并从中读取字符串……有很多选择
请检查您的流状态!尝试使用:
if (std::cin >> x)
// x was parsed from stream... use it
else
// print an error so you know where things failed!
twsaef的评论在本质上是正确的……您正在将一个字符串流式传输到choice中,这将消耗字符直到下一个空格字符,但不包括下一个空格字符——您可能正在键入一个换行符来终止输入,因此它留在缓冲区中。然后使用getline来查看该换行符并读取一个空字符串
最简单的解决方案是调用getline()
来读取初始字符串,然后检查选项是“name\n”还是“user id\n”。最好在比较之前编写一个“trim”函数来删除行中的空白(boost字符串库已经有了这个选项)。否则,您可以使用read并忽略std::cin
中的字符,直到得到一个“\n”。或者甚至可以读取一行,然后放入字符串流并从中读取字符串……有很多选择
请检查您的流状态!尝试使用:
if (std::cin >> x)
// x was parsed from stream... use it
else
// print an error so you know where things failed!
FWIW,在看到更新之前,我猜到了问题是什么(这是愚蠢的普遍现象),在其他的猜测中我暗自发笑(尽管即使他们错过了OP的问题,他们也提出了非常好的观点)
这行代码工作正常,正如广告所说的那样。它没有按照您希望的方式工作
从std::cin读取时,不会暂停程序并等待输入。导致暂停的原因是缺少足够的读取操作输入数据
一次输入一行。请记住,控制台窗口也是一个程序。它负责将用户的按键转换为文本字符(实际上是字节),处理诸如退格键之类的事情,并将其全部收集到行中
因此,假设您使用operator>
读取int
,然后使用getline
读取一行。在用户点击返回键之前,程序不会看到int
,因为这会触发控制台向程序提供一行输入
运算符>>
将跳过前导的空格,读取整数,不使用尾随的空格。换行符是空格。输入中有一个换行符(显然是在行尾)
getline()
将不跳过任何前导空格,并一直读到下一个换行符。下一个字符恰好是换行符,因此getline()
愉快地读取一个空行,程序继续执行该操作
那么,如何解决这个问题呢?如果您正在从cin
读取所有输入,您可能希望程序在每次执行读取操作时都暂停。方法是确保在该点上永远没有任何可用数据,方法是读取所有可用的数据,即整行数据每次你读东西的时候
因此,如wilx所述,请始终阅读cin
中的整行内容,为此请使用免费函数std::getline
。不要使用流的.getline
成员函数。使用std::string
来表示文本字符串。这就是它的用途。它将使您的生活变得更加轻松。这也意味着,如果您期望的是一个整数,而用户键入“76个长号”,那么您就可以删除“长号”数据(并且可以决定您是想扔掉它,还是对用户大喊大叫,让他重新输入一个数字,而无需任何有趣的注释)
但那又怎样?你只是
template <typename T>
// Attempt to read into to_read, and return whether successful.
bool read_primitive_from_input(std::istream& input, T& to_read) {
std::string line;
std::getline(std::cin, line);
std::istringstream iss(line);
return iss >> to_read;
}