定义具有函数的命令行参数

时间:2015-11-01 22:42:39

标签: c parsing command-line-arguments

以下代码:

#include<stdio.h>

void main(int argc, char * argv[]) {
   int i, n, sum = 0;

   if (argc == 1) {
      printf("You have forgot to type numbers.");
      exit(1);
   }

   printf("The sum is: ");
   ///for (i = 1; i < argc; i++)
      ///sum = sum + atoi(argv[i]);

      for(i = 0; i < argc; i++)
        {
            n = atoi(argv[i]);
            sum += n;
        }
   printf("%d", sum);
}

在命令行中给我总和,例如,如果在提示我键入,&#34; program.exe 23 23 32&#34;,输出将是&#34;总和是:68&# 34。

我想将sum逻辑分开,以便它是它自己的函数,然后在提示符下我希望能够输入,&#34; program.exe -sum 23 23 32&# 34;得到相同的结果。

3 个答案:

答案 0 :(得分:0)

我找到了thisthis。后者包含一些有用的代码,几乎完全符合您的要求。他们的例子需要知道正在采用多少个参数(sum函数中的for循环包含i < 5),但可能有办法解决这个问题。

man 3 stdarg也应该有所帮助。

答案 1 :(得分:0)

在我看来,你并不真正需要-前的sum;第一个参数应该是一个简单的字符串:

program.exe sum 1 3 5 9

无论你是否保留破折号,你可以简单地安排将指向参数列表其余部分的指针传递给一个期望的函数:

int sum(int numc, char **numv)

返回数字向量numc中表示为字符串的numv数字的总和。你可以很容易地打电话:

int rv = sum(argc - 2, argv + 2);

在您确定sum是要呼叫的功能之后。你可以拥有这些功能的集合。

如果您遇到过函数指针,您可以自己创建一个名称数组(用户将在命令行上键入)和函数​​指针(指向相应的函数)。然后,您只需查找用户在数组中键入的名称并调用相应的函数。但是,对你来说,这可能仍然是未来。

答案 2 :(得分:0)

在很多C代码中,我们采用快捷方式使解析更容易。例如,假设我们知道我们只有2个运算符选项: sum product 。然后我们知道第一个参数必须是-sum-product。我们只需检查-后跟sp即可简化解析。

至于抽象实际运算符,在这种情况下,只需检查在命令行上选择了哪个运算符,然后根据它应用+=*=,效率可能更高。

以下是一些有效的代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char * argv[]) {
    int n;
    int result;
    int i = 1;
    char operator;

    // parse -sum or -product
    if (argv[i] && argv[i][0] == '-') {
        // we take a shortcut and just look at the first letter
        char firstLetter = argv[i][1];
        if (firstLetter == 's') {
            // using sum
            operator = '+';
            result = 0; // additive identity
        }
        else if (firstLetter == 'p') {
            // using product
            operator = '*';
            result = 1; // multiplicative identity;
        }
        else {
            printf("Unknown option: %s\n", argv[i]);
            exit(1);
        }
        // move on to the next argument
        i++;
    }
    else {
        printf("Please specify an operation (-sum or -product)\n");
        exit(1);
    }

    if (!argv[i]) {
        printf("You have forgot to type numbers.\n");
        exit(1);
    }

    for(; argv[i]; i++) {
        n = atoi(argv[i]);
        if (operator == '+') {
            result += n;
        }
        else { // if (operator == '*')
            result *= n;
        }
    }

    printf("The result is: %d\n", result);

    return 0;
}

请注意,result的初始值因选择的操作而异。

上面的代码不是使用argc,而是利用argv数组以空值终止的事实。换句话说,如果您有3个参数(或argc = 4),则argv[3]将为NULL(相当于0或false)。

请注意,如果启用优化,那么任何体面的C编译器都会将测试移出循环,因此它实际上只检查选择了哪个operator。 (通过查看生成的汇编代码,可以轻松验证。)