【问题标题】:Simple calculator using command line with C++使用 C++ 命令行的简单计算器
【发布时间】:2015-07-17 09:15:45
【问题描述】:

我正在编写一个项目,我们从命令行执行简单的计算器。用户以这种格式输入 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++ 新手

【问题讨论】:

  • atoi(argv[1]) 将数字转换为整数。

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


【解决方案1】:

其他答案是正确的,但我将使用 strtod 代替以 Eris 名义的 atof,因为这样更容易检查输入的正确性。

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,程序可以调用“我是现代少将的典范”并产生结果。结果不好,但结果都一样。

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

【讨论】:

    【解决方案2】:

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

    double value;
    stringstream(someString) >> value;
    

    【讨论】:

      【解决方案3】:

      在行中

      double firstNumber = atoi(argv[1]);
      

      double secondNumber = atoi(argv[3]);
      

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

      【讨论】:

        【解决方案4】:

        问题在于如何将字符串转换为数字:您使用的是atoi,顾名思义,它会将输入转换为整数。

        解决方案是简单地将其替换为atof,它将正确读取浮点数。

        【讨论】:

          【解决方案5】:

          问题来了:

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

          atoi 将字符串转换为int,因此2.5 将转换为21.25 将转换为1,这就是您得到2 + 1 = 3 的原因。请改用atof

          【讨论】:

            猜你喜欢
            • 2015-07-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-31
            • 1970-01-01
            相关资源
            最近更新 更多