getline(cin.name)被跳过了。

4

我在C++中从一个函数调用另一个函数,其中包含一行getline(cin,name),其中name是一个字符串。第一次通过循环时,程序不等待输入。但在所有其他的循环中它都会等待输入。有什么想法吗?

void getName (string& name)
{ 
     int nameLen; 
      do{
          cout << "Enter the last Name of the resident." << endl << endl
              << "There should not be any spaces and no more than 15"
              << " characters in the name."  << endl;



         getline(cin,name);
            cout << endl;
            nameLen = name.length();// set len to number of characters input

         cout << "last" << name << endl;
         }
      while (nameLen < LastNameLength);   
      return;
}

也许在调用函数之前,仍有一些数据等待从stdin中读取。 - Seth Carnegie
请提供一个小而完整的程序来演示这个问题。你所描述的问题可能是由一些你没有展示给我们的代码引起的。 - Greg Hewgill
1
离题:请不要在想要使用'\n'时使用endlendl会冲刷输出流,这是不必要的低效操作。 - Robᵩ
@Rob,除非在可能出现崩溃时打印调试语句。 - Seth Carnegie
3个回答

6

请确保自上次从cin读取内容以来没有剩余的内容,例如:
在程序的早期阶段:

int number;
cin >> number;

您所提供的输入内容:
5

程序后面的部分:
getline(cin,name);

getline 似乎没有被调用,但实际上它是从上次输入中收集了换行符,因为当使用 cin >> 时会留下换行符。


谢谢您的建议。我在getline之前添加了一行cin.ignore('\n')。在之前的函数中有cin语句。这样就解决了问题。 - user1060993

2

你有这样的代码吗:cin << 变量名;

我在使用cin << int变量随后的getline(cin, 变量)时,遇到了getline()跳过运行时错误的情况。

这是因为cin流对象持有一个输入缓冲区。当你输入换行符时,我认为它会从流传递到变量分配中被截断,但仍然包含在cin对象实例本身中。

我使用的另一种解决方法是,在cin << 整数语句之后使用cin.ignore()

另一个用户提到将getline中的所有输入解析为整数、浮点数-不是根啤酒-和字符串。祝你好运,并检查你的代码是否存在cin和getline的双重使用。


2

可能是由于输入流的原因。getline函数在接收到第一个换行符后停止读取输入。例如,如果std::cin的缓冲区中有多个换行符,每次遇到一个换行符时,getline函数都会返回。

检查您期望的输入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接