C++ Cin需要两个输入
在我的代码中,某个cin要求两个输入(值或enter and values)而不是一个,尽管使用了cin.clear和cin.ignore。有人知道问题出在哪里吗 是的,还有16个其他函数和main(),您可以在其中选择要运行的函数。他们都没有这样的问题C++ Cin需要两个输入,c++,C++,在我的代码中,某个cin要求两个输入(值或enter and values)而不是一个,尽管使用了cin.clear和cin.ignore。有人知道问题出在哪里吗 是的,还有16个其他函数和main(),您可以在其中选择要运行的函数。他们都没有这样的问题 int fun; char choice; do { cout << "text" << endl; cin.clear(); cin.ignore( 255, '\n'); cin &g
int fun;
char choice;
do {
cout << "text" << endl;
cin.clear();
cin.ignore( 255, '\n');
cin >> fun; // <<< THIS ONE
switch (fun) {
case 1:
twoNums();
break;
default:
cout << "wrong" << endl;
return 0;
}
cout << "text" << endl;
cin >> choice;
}
while(choice != 'n');
cout << "Quit." << endl;
return 0;
int-fun;
字符选择;
做{
cout fun;//简短回答:
您误用了cin.ignore()
和cin.clear()
。请删除这两行
长答覆:
让我们一步一步地浏览您的代码
cin.clear();
首先,您要求清除cin
上的标志。没有设置标志,因此它什么也不做
cin.ignore( 255, '\n');
您要求跳过下一个255个字符或最多255个字符,直到到达“\n”。流为空,因此在输入数据结束之前,这些条件都不满足。从,eof
标志设置在流上,输入字符保留在流中
您试图从流中提取数据,但设置了eof
标志。提取会自动失败,如果您使用的是C++11标准或更新版本,则fun
将变为0
,或者如果您使用的是旧编译器,则将保持单元化。稍后我将假设使用现代编译器
switch (fun) { }
案例0:
或默认值:
将被执行
cin >> choice;
再次,eof
位设置,提取失败。choice
为零
} while(choice != 'n');
“\0”!=“n”
,继续循环
现在是有趣的部分,为什么它在第二次循环迭代时开始工作?
让我们再次循环:
cin.clear();
您清除了在上一次迭代中设置的eof
标志,流为非空且处于good()
状态
cin.ignore( 255, '\n');
忽略在上一次迭代中输入的值。这取决于您输入值的方式,但它将跳过,直到第一次\n
cin >> fun;
如果流中的下一个值是整数,则已成功提取!从现在开始,如果输入的值对数据类型有效,则循环将正常工作。您使用的cin.ignore
不正确。请将其移动到真正需要的位置。在这种情况下,必须在最后一个整数之后忽略新行已经读过了,所以你可以在选项中阅读
比如:
cout << "text" << endl;
cin >> fun; // <<< THIS ONE
switch (fun) {
case 1:
twoNums();
break;
default:
cout << "wrong" << endl;
return 0;
}
cout << "text" << endl;
cin.ignore( 255, '\n'); //move it here
cin >> choice;
cout-fun;//你的意思是什么?你要求两个输入,一个在循环的开头,一个在循环的结尾。@Yksisarvinen对不起,我的错。刚刚编辑并添加了“THIS-one”指针。如果后面有另一个,为什么你认为一个需要两个输入(或根据您阅读循环的方式,在前面直接输入)?请做一个回答。以这种方式输入字符将需要以下返回不是问题,是吗?“fun未更改”afaik,因为如果提取失败,c++11 zero将写入fun
,对于选择也一样
cout << "text" << endl;
cin >> fun; // <<< THIS ONE
switch (fun) {
case 1:
twoNums();
break;
default:
cout << "wrong" << endl;
return 0;
}
cout << "text" << endl;
cin.ignore( 255, '\n'); //move it here
cin >> choice;