对于模糊的标题感到抱歉,但我真的不知道如何简洁地描述问题......以下是简单的代码:
#include <iostream>
using namespace std;
bool func(int a,char c,int b,int& result)
{
switch(c)
{
case '-':
result=a-b;
break;
case '+':
result=a+b;
break;
default:
return false;
}
return true;
}
int main()
{
cout<<"Usage:A {+|-} B"<<endl;
while(true)
{
int a,b,result;
char c;
cin>>a>>c>>b;
if(func(a,c,b,result))
{
cout<<result<<endl;
}
else
{
cout<<"Input Error!"<<endl;
}
}
return 0;
}
使用该程序的正确方法是输入A {+ | - } B. 例如,您可以输入1 [SPACE] + [SPACE] 2 [ENTER](我的意思是“1 + 2”然后按ENTER)然后它会为我吐出“3”。为了制作程序更强大,我尝试输入1 [空格] + [空格] 2 [空格] + [ENTER]它只是给我很多“2”打印在shell上。是否有人可以告诉我如何修复错误?很多谢谢! PS:代码可在github上找到:bug0x001.cpp
答案 0 :(得分:1)
您无法检查输入是否已正确读取。这是一个强大的计划中要做的第一件事。此外,如果失败,您应该修复输入源。无休止的2流是由一个破碎的cin
引起的。
if( cin>>a>>c>>b &&
func(a,c,b,result))
{
}
else
{
cin.reset();
}
答案 1 :(得分:0)
你的问题是你试图通过cin获取int和char,如果你需要那些确切的输入就可以了,但是当读取奇怪的东西(比如字母为int)时崩溃,因为它读取垃圾
最好的解决方案(对我而言)是将所有内容作为字符串读取(检查cin.getline和类似的内容),然后在“whant”中“解析”输入,例如:
如果您阅读“19+ 32 3”,您可以“轻松”消除所有空格并按任何非数字符号分割,得到3个字符串:s1 =“19”,s2 =“+”和s3 =“323”,然后你只需将每个字符串解析为int(或任何你需要的),将符号解析为char或其他。
如果您发现任何奇怪的东西,您可以尝试理解它,消除它或只显示输入错误。
比测试后执行cin.reset更复杂,但允许您“理解”更多类型的数据输入