看看这段代码:
#include <iostream>
using namespace std;
int main()
{
string s;
int n;
float x;
again:
cout << "Please Type this: ABC456 7.8 9 XYZ\n";
cin >> s >> n >> x >> s;
cout << "\nDo you want to try Again(y/n)? ";
char t;
cin >> t;
if (t=='y' || t=='Y')
goto again;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
只需尝试键入"ABC456 7.8 9 XYZ"并按Enter键,它将导致程序退出,然后提示用户再次尝试.我知道输入是错误的,它们不属于它们的类型,但它为什么会导致退出?以及如何避免退出?
更改
cin >> s >> n >> x >> s;
Run Code Online (Sandbox Code Playgroud)
至
cin >> s >> x >> n >> s;
Run Code Online (Sandbox Code Playgroud)
当您输入7.8第二个输入但是在整数变量而不是浮点变量中收集它.因此,当您输入:
ABC456 7.8 9 XYZ
Run Code Online (Sandbox Code Playgroud)
sgets ABC456,ngets 7(因为它是int类型,输入缓冲区仍然包含.8 9 XYZ\n在其中).接下来n得到.8并最终s得到"9".现在输入缓冲区就XYZ\n在其中.下次当你读入输入t以获得用户的选择时,X会被读入t,因为它不是,y或者Y循环退出.
回答/sf/answers/726552571/解释会发生什么。关于原因,我们必须深入探讨一下哲学。
C++ 流模型不适合“人类交互”:它是一个通用转换器,将几乎无限的字符序列转换为空格分隔的“值”列表,然后将其转换为提供的“变量”。
不存在“对话框的输入和输出交错”的概念。如果您将输入写入文本文件,例如myinput.txt(取消正确的输入)
ABC456 9 7.8 XYZ
Y
ABC456 5 6.7 XYZ
N
Run Code Online (Sandbox Code Playgroud)
并从命令提示符运行您的程序,例如
myprogram < myinput.txt
Run Code Online (Sandbox Code Playgroud)
您的程序将运行...并且不需要“暂停”即可查看输出,因为没有人坐在那里查看并回答它。
程序暂停等待用户输入不是因为cin >>,而是因为cin未处于失败状态并且缓冲区为空并且缓冲区重新映射的源是控制台。返回之前等待'\n'的是控制台,而不是cin。
什么时候cin >> n叫...
operator>>函数被调用,并且它...sbumpc以获取数字并计算数值。所有这些机制使得这样一个事实:如果您输入的内容超出了所需的内容,则缓冲区内容仍然可供下一个使用>>调用使用,无论它是否是另一个程序行。
正确的“更安全”解析需要在读取输入后清除流状态,并忽略接下来的内容直到下一个'\n'。这通常是通过
cin.clear();
cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
Run Code Online (Sandbox Code Playgroud)
这样,输入的任何内容都会被丢弃,接下来cin>>会找到一个没有数据的缓冲区(只是'\n'被修剪为“开始空格”),从而导致控制台再次进入行编辑模式。
| 归档时间: |
|
| 查看次数: |
2007 次 |
| 最近记录: |