如何正确使用cin.clear cin.ignore

时间:2018-09-13 02:42:17

标签: c++ error-handling

    int main()
{
    int oddeven = 1;
    int modulotwo;
    // Simple loop since no reason to check 0
    while(oddeven != 0){
        //user input
        cout << "\n\nIn while loop\n";
        cout << "Input number to determine if it is odd or even.\n";
        cin >> oddeven;
        //check to see if input succesful
        if(!(cin.fail())) {
            cout << "In if loop\n";
            cout << "Divide by two and put in modulotwo.\n";
            //check to see if odd or even by dividing by 2
            modulotwo = oddeven % 2;
            cout << "Output modulotwo: ";
            //visual confirmation of remainder
            cout << modulotwo << "\n";
            if (modulotwo == 0) {
                cout << "Check modulotwo against 0\n";
                cout << "The number " << oddeven << " is even.\n";

            }
            else {
                cout << "The number " << oddeven << " is odd.\n";

            }
        }
        //If input not succesful
        else {
            cout << "In else statement. Set oddeven to 1\n";
            //set oddeven to 1 to stop exit
            oddeven = 1;
            cout << "Not a usable number, please input integer number." << endl;
            cout << "Run cin.clear\n";
            cin.clear();
            cout << "Run cin.ignore\n";
            cin.ignore(std::numeric_limits<std::streamsize>::max());

        }
    }

}

我上面有一个“简单”代码,用于检查数字是奇数还是偶数。我正在尝试向其添加错误更正,以确保输入的类型正确。我被指向cin.clear一个cin.ignore。 我的问题是,如果我引起错误,它将正确地放入else语句中,仅此而已。它将不再运行其余部分。我从cin.ignore假设它。 我如何获取它以正确清除错误并返回输入循环? 如果删除cin.ignore,则会出现一个连续循环,告诉我1是奇数,而无需等待任何输入。

多余的输出文本是我尝试跟踪代码在哪里以及它在做什么的方式。

编辑。在这里发布之前,我实际上已经将cin.ignore注释掉了。我正在尝试自己研究问题,并遇到了有关该问题的评论,以寻找换行符,但正如大家都发现的那样,它不起作用。输入字母而不是任何数字(无论是太大还是其他)时,都会出现此问题。

3 个答案:

答案 0 :(得分:1)

  

我的问题是,如果导致错误,它将正确地放入else语句中,仅此而已。它将不再运行其余部分。

问题出在那

cin.ignore(std::numeric_limits<std::streamsize>::max(), "\n");

第二个参数必须是字符,而不是字符串。

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

提高编译器的警告级别以检测此类错误。

通过使用g++ -std=c++11 -Wall,我收到以下警告/错误消息。

socc.cc: In function ‘int main()’:
socc.cc:43:70: error: invalid conversion from ‘const char*’ to ‘std::basic_istream<char>::int_type {aka int}’ [-fpermissive]
          cin.ignore(std::numeric_limits<std::streamsize>::max(), "\n");
                                                                      ^
In file included from /usr/include/c++/5/iostream:40:0,
                 from socc.cc:1:
/usr/include/c++/5/istream:657:5: note:   initializing argument 2 of ‘std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::ignore(std::streamsize, std::basic_istream<_CharT, _Traits>::int_type) [with _CharT = char; _Traits = std::char_traits<char>; std::streamsize = long int; std::basic_istream<_CharT, _Traits>::int_type = int]’
     basic_istream<char>::

答案 1 :(得分:0)

我自己尝试了您的代码,然后我的编译器立即向我显示一条错误消息,指向此行:

cin.ignore(std::numeric_limits<std::streamsize>::max(), "\n");

您在cin.ignore函数中的第二个参数应该是字符,而不是字符串。只需更改引号并编辑该行即可显示

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

它应该按照您想要的方式工作:)。我会考虑更新您的IDE或编译器以显示更好的错误消息/调用堆栈。

答案 2 :(得分:0)

cin.clear(1000,'\ n');

1000是要忽略的字符数,将其更改为您想要的任何字符