在 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
允许丢弃部分流。
我有一个程序可以获取两个数字并将它们显示在屏幕上。
但是,当我在输入第一个数字后点击 "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
允许丢弃部分流。