C++ Cin需要两个输入

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

在我的代码中,某个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 >> 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;