在 C++ 程序中按回车键后,"cin"将馈送所有变量



我有一个程序,它接受两个数字并将它们显示在屏幕上。

然而,当我在输入第一个数字后点击"回车"时,我的程序会在让我输入第二个数字之前显示答案。

为什么会发生这种情况?

int main()
{
int n1;
float n2;
cin>>n1;
cin>>n2;
cout<<"int n:"<<n1<<endl<<"float n:"<<n2;
return 0;
}

我想输入0.25和35,但当我写0.25并点击回车键时,突然显示答案"int:n:0float n:0.25",它不允许我写第二个数字。我的操作系统是Win10,这个程序是用DevCpp编译的

当两个变量都是int时,它就起作用了。

cin>>n1; cin>>n2;cin >> n1 >>n2之间没有差异。回车键只作为同步输入缓冲区和流缓冲区的信号。cin不按行输入,而是在有可用数据量时解析缓冲区。如果解析不完整,则等待。如果解析无法完成,它将停止并更改状态位。要继续解析,您必须忽略或清除部分或全部缓冲区内容。

在第一行中输入了错误内容,导致cin进入bad()状态。如果您通过远程终端运行程序,可能会出现边缘情况,一些不正确的字符可能会出现,例如Windows中的新行生成的^M会破坏Linux上的cin流。如果您从保存在不同平台上的文件中输入,也会出现这种情况。在Windows上,行尾由两个字符组成,#10和#13。在linux蒸汽上,只期望#13作为新行和缓冲区刷新信号,#10是一个意外的字符。

编辑(OP提供输入数据信息后(:

"0.25"将被解析为"0"one_answers".25",这是预期的并记录的流行为。一旦流遇到不符合int模式的字符(可能是空格、行尾、字母或标点符号(,就停止了对n1的分析。在这种情况下,句号被视为标点符号

然后,它尝试从流输入中获取一个浮点值,缓冲区包含".25"。这是一个合法的浮点符号,它被分配给n2

当你有两个"int"时,你根本无法用相同的输入获得第二个值,它总是0,因为cin在坏状态下锁定,即方法的istream::good()返回false。读取变量后,您必须检查流的状态。任何无法解析.25的进一步格式化读取都不会使流超过那个点。

如果您想逐行独占地从流中读取,则必须使用istream::getline()方法来获取字符串。还有可以获取流的内容的方法CCD_ 13和允许丢弃流的一部分的CCD_。

最新更新