如何使这个C ++程序更健壮?

时间:2015-05-18 11:45:18

标签: c++

对于模糊的标题感到抱歉,但我真的不知道如何简洁地描述问题......以下是简单的代码:

#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

2 个答案:

答案 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更复杂,但允许您“理解”更多类型的数据输入