为什么不能连续两次使用std::cin.getline() ?
Why can I not use std::cin.getline() twice in succession?
只有对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
来清除failbit
和istream::ignore
,以忽略istream::getline
之后的其余部分:
std::cin.getline(line, recordLen+1);
std::cin.clear();
std::cin.ignore( std::numeric_limits<streamsize>::max(), 'n' );
相关文章:
- 在 std::getline 和 std::cin 期间卡在循环中
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- std::getline没有在while循环中重新请求用户输入
- 如何将 std::getline 转换为模板类型?
- 如何在 std::getline 中自定义分隔符
- 使用std::getline()读取一行
- std::getline with std::fstream
- 在 std::getline() 上使用任何字符作为分隔符
- C++ - 重复 std::getline() 作为用户整数输入?
- std::getline 读取最后一个字符串两次
- std::getline 未产生正确的输出 (C++)
- C STD :: getline / std :: Sort无法正常工作
- std::getline(std::cin, string) 可能因键盘输入失败的方式
- 可以将std::getline()与从std::string中移出的字符串一起使用吗
- 为什么在同一输入上调用std::getline()n次会产生第n个标记化
- std :: getline(输入,d.info)不起作用
- 用弦乐库解析行时的std :: getline问题
- std :: getline()读取马车返回 r,如何避免
- SEGFAULT与STD :: getline一起使用定界线
- progam在std :: getline AM之后停止响应,代码中是否存在错误