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;
}