Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么即使输入有效,cin.failbit也始终设置?_C++_Arrays_Cin_Getline - Fatal编程技术网

C++ 为什么即使输入有效,cin.failbit也始终设置?

C++ 为什么即使输入有效,cin.failbit也始终设置?,c++,arrays,cin,getline,C++,Arrays,Cin,Getline,我试图编写一个程序,要求使用cin.getline()输入一个字符数组,如果给定的输入大于数组长度,数组就会扩展 我使用了cin.failbit来查看用户的输入是否太长。但一切都不顺利。所以在调试之后,我发现问题在于failbit 所以我写了一个简单的程序来看看它到底出了什么问题,结果是,cin.failbit总是在if语句中返回true,即使输入看起来有效 int main () { char name[256]; std::cout << "Enter your

我试图编写一个程序,要求使用
cin.getline()
输入一个字符数组,如果给定的输入大于数组长度,数组就会扩展

我使用了
cin.failbit
来查看用户的输入是否太长。但一切都不顺利。所以在调试之后,我发现问题在于
failbit

所以我写了一个简单的程序来看看它到底出了什么问题,结果是,
cin.failbit
总是在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";
    }
} 
int main(){
字符名[256];
std::cout是一个常量,指示哪些错误位表示流失败。它不是流当前状态的指示。若要检查是否设置了该位,请改用成员函数

但是,如果由于到达流的末尾而导致流读取失败
fail()
将返回
false
使您相信它成功了。希望检查最后一个操作是否成功。

是一个常量,指示哪个错误位表示流失败。它不是流当前状态的指示。若要检查该位是否已设置,请改用成员函数


但是,如果由于到达流的末尾而导致流读取失败,
fail()
将返回
false
,使您相信它成功了。请检查最后一次操作是否成功。

@fran请在回答中回答而不是注释。FWIW如果(!std::cin),您可以使用
而是检查流是否处于失败状态。我错了,没有
failbit
成员函数。它检查的值不是零。我想到的是
fail()
成员函数。
std::cin.failbit
是一个常量,指示哪个位表示失败状态,它没有检查流的状态。感谢回复。我考虑过使用cin.fail()或者!cin,但当用户的输入长度超过数组的len时,不会调用它们。用户的输入只是被剪切,超过数组大小的所有字符都保留在缓冲区中(至少我观察到了这一点)@keptt不,
failbit
不是状态意义上的标志。它表示哪个位与该标志关联。它不能设置或清除,它是一个常量。“the
failbit
标志”表示“位掩码
failbit
指示的位”。@fran请回答而不是注释。FWIW如果(!std::cin)
来检查流是否处于失败状态。我错了,没有
failbit
成员函数。它正在检查的值不是零。我正在考虑
fail()
成员函数。
std::cin.failbit
是一个常量,指示哪个位表示失败状态,它没有检查流的状态。感谢回复。我考虑过使用cin.fail()或者!cin,但当用户的输入长度超过数组的len时,不会调用它们。用户的输入只是被剪切,超过数组大小的所有字符都保留在缓冲区中(至少我观察到了这一点)@keptt否,
failbit
不是状态意义上的标志。它指示哪个位与该标志关联。它不能设置或清除,它是一个常量。“
failbit
标志”表示“位掩码
failbit
指示的位”。我很感激您的回答,但对我来说,关于failbit的部分只会干扰getline description第4块此处的说明:“如果函数未提取任何字符,或者在(n-1)个字符写入s后未找到分隔字符,则设置failbit标志”.所以对我来说confusing@keptt错误状态存储在一个位集中。
failbit
是一个常量,指示哪个位表示失败。例如,它的值可能是常量
8
,指示第四位表示失败。在这种情况下,
if
基本上是
if(8)
并且不考虑流的当前状态。
failbit
的一个使用示例可能是
std::cin.rdstate()&std::ios_base::failbit
,以查看
failbit
rdstate()返回的位集中是否为
1
。谢谢,我想我现在明白了。我试着按照你的建议去做,并使用了cin.good()-到目前为止效果还不错。不要太烦人,但你介意我问一下如何处理failbit吗?如果它是一个常量,那么它应该有某种默认值,如果我键入smth like-If(cin.failbit==默认值)这意味着没有检测到可能触发故障位的错误,一切正常。是这样吗?@keptt no.
failbit
cin
的状态无关。假设它是一个全局常量(因为它就是这样的)。您无法从中提取有用的信息,它是一个数字,并且在您的程序的生命周期中始终是该数字。想象一下,无论您在哪里看到
failbit
,它都只会说
4
,或
16
,或它具有的任何值。它在程序的生命周期中无法更改。它的唯一用途是作为bitm请求帮助您解释由
rdstate()
返回的值。
std::cin.failbit
编译的事实是误导性的。
failbit
是一个
static constexpr
。我很感谢您的回答,但对我来说,关于failbit的部分只是干扰了getline描述,这里的第四块指出:'如果函数未提取任何字符,或者在(n-1)个字符写入s后未找到定界字符,则设置failbit标志所以对我来说confusing@keptt错误状态存储在位集中。
failbit
是一个常量,指示哪些位表示失败。例如,它的值可能是