使用C ++命令行的简单计算器

时间:2015-05-07 01:07:03

标签: c++ command-line-arguments calculator

我正在编写一个项目,我们从命令行执行简单的计算器。用户以此格式输入 programname firstNumber operator secondNumber 。这是我到目前为止所得到的:

#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;

int main(int argc, char* argv[])
{
    cout << fixed << setprecision(2);
    if (argc != 4)
    {
        cerr << "Usage: " << argv[0] << " <number> <operator> <number>" << endl;
        exit(0);
    }
    else
    {
        double firstNumber = atoi(argv[1]);
        char theOperator = argv[2][0];
        double secondNumber = atoi(argv[3]);
        switch (theOperator)
        {
        case'+':
        {
                   cout << "The answer is " << firstNumber + secondNumber << endl;
                   break;
        }
        case '-':
        {
                    cout << "The answer is " << firstNumber - secondNumber << endl;
                    break;
        }
        case '*':
        {
                    cout << "The answer is " << firstNumber * secondNumber << endl;
                    break;
        }
        case '/':
        {
                    if (secondNumber == 0)
                    {
                        cout << "Can not devide by a ZERO" << endl;
                        break;
                    }
                    else
                    {
                        cout << "The answer is " << firstNumber / secondNumber << endl;
                        break;
                    }
        }
        }
    }
}

我想出了一个问题,我的项目计算错误的十进制数。例如,如果我做2.5 + 1.25,结果是3.有人可以帮助我吗?我是C ++的新手

5 个答案:

答案 0 :(得分:4)

其他答案都是正确的,但是我要使用strtod而不是以Eris的名义进行推销,因为检查输入的正确性会更容易。

char * endp;
double firstNumber;
if (argv[1][0] != '\0')
{ // input string is not empty 
    firstNumber = strtod (argv[1], &endp);
    if (*endp != '\0')
    { // number didn't end at the end of the string. String not a number.
        cout << "First number was not a number, dude." << endl;
        return 0;
    }
}
else
{
    cout << "Can't do much without a number, dude." << endl;
    return 0;
}

通过atof,可以使用&#34来调用该程序;我是现代少将的模型&#34;并产生结果。结果不好,但结果都一样。

哦,并在C ++中调用exit时发出警告。程序在那里停止死亡,并且没有调用析构函数。这里没有坏处,但不是一个好习惯。

答案 1 :(得分:3)

在行

double firstNumber = atoi(argv[1]);

double secondNumber = atoi(argv[3]);

atoi将参数转换为int(因此在小数点后截断)。您需要将其转换为double。您应该使用std::atof,或者,如果使用C ++ 11,也可以使用std::stod(argv[1]);

答案 2 :(得分:3)

问题在于:

double firstNumber = atoi(argv[1]);
char theOperator = argv[2][0];
double secondNumber = atoi(argv[3]);

atoi会将字符串转换为int,因此2.5将转换为2,而1.25将转换为1,即“{1}}为什么你得到结果2 + 1 = 3。请改用atof

答案 3 :(得分:3)

问题是如何在数字中转换字符串:您正在使用WeakReference,其名称建议将输入转换为整数。

解决方案是简单地用atoi替换它,这将正确读取浮点数。

答案 4 :(得分:1)

除了@meneldal建议,您还可以在C ++中使用stringstream将字符串转换为数字

double value;
stringstream(someString) >> value;