为什么不能连续两次使用std::cin.getline() ?

Why can I not use std::cin.getline() twice in succession?

本文关键字:std getline cin 两次 连续 不能 为什么      更新时间:2023-10-16

只有对getline()的第一次调用似乎从std::cin中读取了任何内容。buffer包含的内容有问题吗?为什么getline()不直接覆盖buffer的内容?

我怎么能得到第二个调用getline()读取的东西?

我代码:

const int recordLen = 20;
// truncate the input to 20 chars
void getText(char line[])
{
  std::cout << "Enter something for getText: ";
  std::cin.getline(line, recordLen+1);
  for(int i = std::strlen(line); i < recordLen; i++)
  {
    line[i] = ' ';
  }
  line[recordLen] = '';
}
int main()
{
  char buffer[340];
  getText(buffer);
  std::cout << buffer;
  std::cout << "Now enter some more text:";
  // put more text into buffer
  std::cin.getline(buffer, 30);
  std::cout << "you entered : " << buffer << std::endl;
  return 0;
}

程序输出示例:

为getText输入:alskdjfalkjsdfljasldkfjlaksjdfalskdjfalkjsdfljasld现在输入更多的文本:

显示"Now enter some more text:"后,程序立即显示"you entered:"。它没有给我输入更多文本的机会,也没有显示从之前调用getline()中截断的任何字符。

std::cin.getline(line, recordLen+1);

在这里,如果输入大于recordLen字符,则不读取其余字符并保留在流中。下次从cin读取时,将读取剩余的字符。请注意,在本例中,cin将提高其failbit,这可能就是您所遇到的情况。

如果你的第一个输入恰好是recordLen个字符长,那么只有换行符将留在流中,并且下一次调用getline将显示读取一个空字符串。

除此之外,getline会覆盖缓冲区。

如果您想忽略同一行中recordLen的第一个字符以外的任何内容,您可以调用istream::clear来清除failbitistream::ignore,以忽略istream::getline之后的其余部分:

std::cin.getline(line, recordLen+1);
std::cin.clear();
std::cin.ignore( std::numeric_limits<streamsize>::max(), 'n' );