【发布时间】:2019-05-30 11:01:33
【问题描述】:
我正在尝试编写一个程序,要求使用cin.getline() 输入一个字符数组,如果给定的输入大于数组长度,则数组得到扩展。
我使用cin.failbit 来查看用户的输入是否太长。但一切都不顺利。所以调试后发现问题出在failbit。
所以我写了一个简单的程序来看看它有什么问题,结果发现cin.failbit always 在 if 语句中即使在输入时也会返回 true似乎有效。
int main () {
char name[256];
std::cout << "Enter your name: ";
std::cin.getline (name,256, '\n');
std::cout << "characters read: " << std::cin.gcount() << std::endl;
if (std::cin.failbit){
std::cin.clear();
std::cout << "failed\n";
}
}
例如,当输入为“qwer”时,程序输出已读取 5 个字符(cin.gcount),所以应该没问题,但它也输出“fail”,表示设置了失败位标志。但我认为不应该出现在这种情况下。
那么谁能解释为什么failbit 似乎被永久设置了?
我们将不胜感激任何帮助
【问题讨论】:
-
@fran 请不要回答 cmets。
-
FWIW 你可以使用
if (!std::cin)来检查流是否处于故障状态。 -
我错了,没有
failbit成员函数。它正在检查failbit bit mask 的值是否不为零。我在想fail()成员函数。std::cin.failbit是一个常量,表示哪个位表示失败状态,它不检查流的状态。 -
感谢您的回复。我考虑使用 cin.fail() 或 !cin 但当用户的输入长于数组的 len 时,它们不会被调用。用户的输入刚刚被剪切,所有超过数组大小的字符都保留在缓冲区中(至少这是我观察到的)
-
@keptt 不,
failbit不是状态意义上的标志。它指示哪个位与该标志相关联。它不能被设置或清除,它是一个常数。短语“failbit标志”表示“位掩码failbit指示的位”。