C 定义带函数的命令行参数

C 定义带函数的命令行参数,c,parsing,command-line-arguments,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++)

以下代码:

#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);
}
#包括
void main(int argc,char*argv[]){
int i,n,和=0;
如果(argc==1){
printf(“您忘记键入数字了。”);
出口(1);
}
printf(“金额为:”);
///对于(i=1;i
在命令行中为我提供总和,因此,例如,如果在提示下键入“program.exe 23 32”,则输出将为“总和为:68”

我想分离求和逻辑,使之成为它自己的函数,然后在提示符处键入“program.exe-sum 23 23 32”以获得相同的结果。

我找到了和。后者包含一些有用的代码,几乎完全按照您的要求执行。他们的示例需要知道取了多少个参数(函数
sum
中的for循环包含
i<5
),但是有一种方法可以解决这个问题


也应该有帮助。

在我看来,你并不真的需要
-
总和前面;第一个参数应为简单字符串:

program.exe sum 1 3 5 9
无论是否保留破折号,都可以简单地安排将指向参数列表其余部分的指针传递给一个函数,该函数期望:

int sum(int numc, char **numv)
它返回在数字向量
numv
中表示为字符串的
numc
数字的总和。你可以很容易地称之为:

int rv = sum(argc - 2, argv + 2);
在确定要调用的函数是
sum
之后。你可以有一个这样的函数集合


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

在许多C代码中,我们采用快捷方式来简化解析。例如,假设我们知道我们只有两种运算符选择:和或积。然后我们知道第一个参数必须是
-sum
-product
。我们可以通过检查
-
然后再检查
s
p
来简化解析

至于抽象实际的操作符,在这种情况下,只需检查命令行上选择了哪个操作符,然后基于此应用
+=
*=
,可能更有效

以下是一些工作代码:

#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;
}
#包括
#包括
int main(int argc,char*argv[]){
int n;
int结果;
int i=1;
字符算子;
//解析和或乘积
if(argv[i]&&argv[i][0]='-'){
//我们走捷径,只看第一个字母
char firstLetter=argv[i][1];
如果(第一个字母=='s'){
//使用和
运算符='+';
结果=0;//加法标识
}
else if(firstLetter=='p'){
//使用产品
运算符='*';
结果=1;//乘法恒等式;
}
否则{
printf(“未知选项:%s\n”,argv[i]);
出口(1);
}
//转到下一个论点
i++;
}
否则{
printf(“请指定一个运算(-sum或-product)\n”);
出口(1);
}
如果(!argv[i]){
printf(“您忘记键入数字了。\n”);
出口(1);
}
for(;argv[i];i++){
n=atoi(argv[i]);
if(运算符=='+'){
结果+=n;
}
else{//if(运算符=='*')
结果*=n;
}
}
printf(“结果是:%d\n”,result);
返回0;
}
请注意,
result
的初始值因选择的操作而异

上面的代码没有使用
argc
,而是利用了
argv
数组以null结尾这一事实。换句话说,如果有3个参数(或
argc
=4),则
argv[3]
将为
NULL
(相当于
0
或false)


请注意,如果启用了优化,那么任何体面的C编译器都会将测试移到循环之外,因此它实际上只检查选择了一次的
操作符。(这很容易通过查看生成的汇编代码进行验证。)

main()
返回
int
。你的问题是什么?使用像
-sum
这样的参数并不意味着它有自己的函数。你只需要解析参数并相应地采取行动。我明白你的意思。我想我在解析部分有点卡住了,也就是我们如何定义参数。第一个是程序名,第二个是函数名,而第三个参数是相应的数据,在本例中是一组要求和的整数。我不认为OP在这里寻找的是
va_arg
。使用数组更有意义(特别是因为
argv
已经是一个要求和的值数组)。