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注释掉了。我正在尝试自己研究问题,并遇到了有关该问题的评论,以寻找换行符,但正如大家都发现的那样,它不起作用。输入字母而不是任何数字(无论是太大还是其他)时,都会出现此问题。
答案 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是要忽略的字符数,将其更改为您想要的任何字符