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

时间:2015-05-05 00:13:58

标签: c++ command-line calculator

我是C ++的新手。我正在使用命令行编写一个简单的计算器。命令行应具有以下格式: programname firstNumber运算符secondNumber 这是我到目前为止所得到的:

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

int main(int argc, char* argv[])
{
    if (argc != 3)
    {
        cerr << "Usage: " << argv[0] << endl;
        exit(0);
    }
    else
    {
        int firstNumber = atoi(argv[1]);
        char theOperator = atoi(argv[2]);
        int 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;
                }
            }
        }
    }
}

程序无法运行。当我运行它时,它会显示一个适当的用法消息并结束程序。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:4)

其他人已经给你答案,但你可以很容易地自己想出这个。只需在您知道代码进入的位置打印argc

int main(int argc, char* argv[])
{
    if (argc != 3)
    {
        cout << "argc is: " << argc << endl; // Debug output that you delete later
        cerr << "Usage: " << argv[0] << endl;
        exit(0);
    }
    else

然后回来argc。当你发现argc实际上是4并且你想知道argc里面的内容时,你应该写一些代码来打印它,这样你就可以搞清楚......就像这样:

int main(int argc, char* argv[])
{
    cout << "argc is: " << argc << endl; // Debug output that you delete later
    for (int i = 0; i < argc; ++i)
    {
        // Print out all of the arguments since it's not working as you expect...
        cout << "argv[" << i << "] = " << argv[i] << endl;
    }

    if (argc != 3)
    {
        cerr << "Usage: " << argv[0] << endl;
        exit(0);
    }
    else

你很快就会弄清楚出了什么问题......

请了解如何执行此操作,因为它会保存您的,但将来您无需等待答案。

此外,您的代码中还有其他错误。

为什么你要将+字符从字符串转换为int?

else
{
    int firstNumber = atoi(argv[1]);
    char theOperator = atoi(argv[2]); // <<< WTF? Why?
    int secondNumber = atoi(argv[3]);
    switch (theOperator)

你可能想摆脱那里的atoi部分,然后选择:

char theOperator = argv[2][0]; // First character of the string

如果第二个参数总是只有一个字母......你可能想要强制执行/检查。请参阅strlen()std::string,并注意argv[2]的类型为char*(指向char的指针)。

我还建议您阅读How to debug small programs链接的SO Howto-Ask Help Page。这可能会有所帮助。不,我认为你的问题不好。调试小程序是您将来需要的一项技能,如果您打算编程,那么现在就可以从中受益。

欢迎使用编程和C ++:)

答案 1 :(得分:1)

如果您输入

Noda Time      | .NET BCL                   | SQL Server
---------------|----------------------------|------------------------------------------
Instant        | DateTime or DateTimeOffset | datetime2 or datetimeoffset
OffsetDateTime | DateTimeOffset             | datetimeoffset
LocalDateTime  | DateTime                   | datetime2
LocalDate      | DateTime                   | date
LocalTime      | TimeSpan                   | time
Duration       | TimeSpan                   | int or bigint (Ticks, TotalSeconds, etc.)
Period         | String                     | varchar
ZonedDateTime  | DateTimeOffset + String    | datetimeoffset + varchar (or a UDT)

你有4个参数,而不是3个。

#slide-4.step.active {  
#logo img {
transform: scaleX(-1);
}
}

看起来你的程序工作正常......至少就打印用法信息而言。

另请参阅有关使用operator参数的其他注释。

答案 2 :(得分:1)

参数argc也会计算程序的名称。

试试这个:

if (argc != 4) // We expect 4 arguments: programname number operator number
{
    cerr << "Usage: " << argv[0] << " <number> <operator> <number>" << endl;
    exit(0);
}

在您的代码中,正确运行程序(包含所有3个参数)会显示错误消息,因为argc等于4