将命令行参数解析/转换为不同的类型

时间:2014-10-28 02:02:14

标签: c++ visual-studio-2012

我正在尝试编写一个接受命令行参数的应用程序,如1 + 2,计算并打印输出。我是c ++的新手,所以我写了一些代码 - 这是行不通的。我认为我的主要问题是缺乏知识,我无法弄清楚如何解析和转换这个表达式

1必须进入int / double +必须保留一个字符串才能通过switch语句 2必须进入int / double

我已经知道如果有空格那么每个参数将包含相应的字符串argv [2] =“1”argv [3] =“+”argv =“2”所以我现在需要的是将它们转换为正确的数据类型,以便我可以执行计算,我也尝试使用strtod进行转换但是每个都抛出异常,加上显然我不能按照它的方式编写switch语句,因此它需要是一个字符串。我对所有的转换感到非常困惑。如果我以正确的方式思考,请告诉我?

 // Calculate.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <tchar.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    double oper1 = atof(argv[2]);
    double oper2 = atof (argv[4]);

    switch(char[3]){
    case "+":
        cout<< oper1 + oper2;
        break;
    }


    return 0;
}

2 个答案:

答案 0 :(得分:2)

试试这个

// Calculate.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <tchar.h>
#include <stdlib.h>
#include <iostream>
using namespace std;



 int main(int argc, char* argv[])
{
    double coeff1 = atof(argv[1]);
    double coeff2 = atof (argv[3]);
    char op = argv[2][0];

    switch(op){
    case '+':
        cout << coeff1 + coeff2 << endl;
        break;
    default:
        cout << "unhandled operation " << argv[2] << endl;
        break;
    }

    return 0;
}

请注意您的代码。

switch(char[3]){

不正确,你没有名为char的数组(你不可能是一个保留字)。

您无法打开字符串值,因此您必须将其设为char。

您的命令行参数是字符串。所以你从你的论点中读出第一个字符。

char op = argv[2][0];

在您的开关中,您现在可以使用

switch(op){
在您的案例陈述中

 case "+":

错了。在&#34;&#34;是一个字符串,你必须使用&#39;&#39;为了一个字符

case '+':

其他人已经解释了这一点,但你的论点是从argv [1]开始的,arg [0]是程序的名称(尝试将其打印到cout)。因此,如果您调用可执行文件,例如。

Calculate 1 + 2

参数看起来像

argv[0] = "Calculate"
argv[1] = "1"
argv[2] = "+"
argv[3] = "2"

注意:该程序没有错误检查,如果没有至少3个命令行参数,它将崩溃。您可以使用argc来确定提供的命令行参数的数量。

答案 1 :(得分:1)

我建议这样的事情: (所有相关的包括)

using namespace std;

int main(int argc, char* argv[])
{
    if(argc != 4) {
        cout << "usage: calculate <op1> <operation> <op2>" << endl;
        return 1;
    }
    double oper1( atof(argv[1]) );
    double oper2( atof(argv[3]) );
    string operation( argv[2] );
    if(operation == "+") {
        cout << oper1 + oper2;
    } else if (operation == "-") {
        cout << oper1 - oper2;
    } else {
        cout << "illegal operation '" << operation <<"'" << endl;
        return 1;
    }
    return 0;
}

它不检查指定的有效浮点数