C++ 在c++;按enter键后的程序;cin";将提供所有变量

C++ 在c++;按enter键后的程序;cin";将提供所有变量,c++,input,cin,C++,Input,Cin,我有一个程序,需要两个数字,并显示在屏幕上 然而,当我输入第一个数字后点击“回车”时,我的程序会在让我输入第二个数字之前显示答案 为什么会发生这种情况 int main() { int n1; float n2; cin>>n1; cin>>n2; cout<<"int n:"<<n1<<endl<<"float n:"<<n2; return 0; }

我有一个程序,需要两个数字,并显示在屏幕上

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

为什么会发生这种情况

int main()
{
    int n1;
    float n2;

    cin>>n1;

    cin>>n2;

    cout<<"int n:"<<n1<<endl<<"float n:"<<n2;

    return 0;
}
intmain()
{
int-n1;
浮氮气;
cin>>n1;
cin>>n2;

coutcin>>n1;cin>>n2;
cin>>n1>>n2
之间没有区别。Enter键仅作为同步输入缓冲区和流缓冲区的信号。cin不是每行输入,它在有可用数据量时解析缓冲区。如果解析不完整,它将等待。如果无法完成解析,它将停止并声明位更改若要继续解析,请忽略或清除部分或全部缓冲区内容

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

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

“0.25”将被解析为“0”和“.25”,这是预期和记录的流行为。
n1
的解析已在流遇到不符合int模式的字符时停止,该字符可能是空格、行尾、字母或标点符号。在本例中,句点被视为标点符号

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

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


如果您想以独占方式逐行读取流,则必须使用
istream::getline()
获取字符串的方法。还有方法
get
可以获取流的内容,还有方法
ignore
可以丢弃流的一部分。

程序失败的输入是什么?预期的输出是什么?实际的输出是什么?什么操作系统?这对我来说很有用,可以使用Microsoft Visual S复制和稍微编辑tudio Community 2017。你需要准确地告诉我们你提供了什么输入。我想输入0.25和35,但当我写0.25并点击enter时,突然显示出答案“int:n:0 float n:0.25”,它不允许我写第二个数字。我的操作系统是Win10,这个用DevCpp“0.25”编译的程序将被解析为“0”和“.25”,这是预期和记录的流行为。当你有两个整数时,你根本无法获得第二个值。在这种情况下,它总是0,因为cin锁定在错误状态。我想为int变量输入一个浮点数,为float变量输入一个浮点数,但在写入第一个num后,它会显示答案。ex)12.5然后输入->int n:12 float:0。5为什么会发生这种情况?它不允许我写第二个num!!@DariushStony.12.5不是整数。12是.coincental;y.5是合法的浮点。解析在句点处停止,因为句点是int的非法字符。缓冲区保持不变。然后.5被解析为浮点。Enter根本不重要,它只是刷新缓冲区,而不是分隔值。“我想为int变量输入一个浮点数”-您希望结果值是什么?