在 C++ 程序中按下 enter 后, "cin" 将提供所有变量

in c++ program after pressing enter , "cin" will feed all Variables

我有一个程序可以获取两个数字并将它们显示在屏幕上。

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

为什么会这样?

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:0 float n:0.25" 它不允许我输入第二个数字。我的 os 是 Win10,这个程序是用 DevCpp

编译的

当两个变量都是整数时有效。

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

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

编辑(在 OP 提供有关输入数据的信息之后):

“0.25”将被解析为“0”和“.25”,即预期和记录的流行为。一旦流遇到不符合 int 模式的字符,n1 的解析就会停止,这些字符可能是 space、行尾、字母或标点符号。在这种情况下,句点被视为标点符号

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

当你同时拥有两个 "int" 时,你无法使用相同的输入获得第二个值,它始终为 0,因为 cin 锁定在错误状态,即方法 [=18] =] returns false。读取变量后必须检查流的状态。任何无法解析 .25 的进一步格式化阅读都不会超过该点。

如果你想从流中逐行读取,你必须使用istream::getline()方法来获取字符串。还有方法 get 可以获取流的内容和 ignore 允许丢弃部分流。