【问题标题】:parsing/converting command line arguments into different types将命令行参数解析/转换为不同类型
【发布时间】:2014-10-28 02:02:14
【问题描述】:

我正在尝试编写一个接受命令行参数(如 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;
}

【问题讨论】:

  • 代码有很多问题。例如,在 C/C++ 中,数组索引从 0 开始,而不是 1。双引号表示字符串,而不是字符,并且 C++ 的 switch 语句不适用于字符串。语法“char[3]”也不会将 argv 数组的第四个元素转换为 char 类型。
  • @akton 至少我今天学到的一点是,当您传递命令行参数时,实际参数从数组的位置 2 开始。它说总是为实际命令保留 1,不确定 0 用于什么。我知道单引号和双引号的区别,我不明白为什么 char* 像字符串一样,但是如果我切换 char 并更改为单引号,它无论如何都不起作用
  • 其实argv就是解析后的命令行,所以argv中的第一个元素(argv[0])通常是可执行文件名。请参阅stackoverflow.com/questions/2050961/… 了解更多信息。
  • @Jenny 参数确实从数组中的位置 2 开始。然而,在 C++ 中,这是索引 1(位置 1 是索引 0,通常是程序名称)。
  • argv[0] = 命令,argv[1] = 第一个参数

标签: c++ visual-studio-2012


【解决方案1】:

试试这个

// 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 op = argv[2][0];

你现在可以在你的 switch 中使用

switch(op){

在你的案例陈述中

 case "+":

错了。 "" 中的任何内容都是字符串,您必须使用 '' 作为字符

case '+':

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

Calculate 1 + 2

参数看起来像

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

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

【讨论】:

  • 是的,错误检查完全失败了,我的本机是 java,所以我习惯于 java 异常处理......并且不知道在 c++ 中执行 return 很重要
  • 这里的返回值并不重要(注意我的例子总是返回0)。您必须确保正确解释运算符(+、- 等)。这是您的初始代码失败的地方。您可以比较字符(我的示例)或字符串(其他答案)。
【解决方案2】:

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

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;
}

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

【讨论】:

  • 现在我明白了,我完全误解了异常处理。只是因为我没有返回我的程序不会编译。你太棒了!
  • 退货与此无关。您的程序始终返回 0。正如@Paul Roony 指出的那样,您的程序不可编译,因为名称为“char”的数组不存在。 "char[3]" 没有做你想做的事。您可以使用 argv[2][0] 提取第三个参数的第一个字符
猜你喜欢
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
相关资源
最近更新 更多