C程序中的命令行参数(来自shell)

adv*_*ena 0 c command-line-arguments

我正在写一个命令行计算器.用户提供的每个表达式必须用空格分隔(这是惯例).例如:./calc 2 + 5 * sin 45

问题是,当我尝试获取每个表达式时,我也得到了作为参数的所有文件,这些文件位于我已编译代码的文件夹中...

这是代码:

int main(int argc, char* argv[]) {
    double result;
    int i;
    printf("Number of arguments: %d\n", argc);

    for (i=0; i<argc; i++) {
        printf("Argument: %s\n", argv[i]);
    }

    //result = equation(argv, argc);
    //printf("Result is: %f", result);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

并且该示例表达式的输出是:

Number of arguments: 10
Argument: ./calc
Argument: 2
Argument: +
Argument: 5
Argument: calc
Argument: calculate.c
Argument: lab2
Argument: sin
Argument: 45
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么calc calculate.c lab2(当然编译该程序的文件夹包含所有三个文件).我应该在单独的文件夹中编译它吗?我尝试了这种方法,但仍然存在"计算"

PS.我正在使用gcc编译器:gcc calculate -o calc

Jon*_*art 6

这与您的程序无关,也与您的shell有关.

大多数shell *将通配符扩展为所有匹配的文件.这包括像bash和Windows'这样的UNIX shell cmd.

你无能为力; 它只是它的工作原理.

另一种方法是让你的程序接受一个参数,这是一个包含要解析的表达式的字符串.当然,您必须进行解析,而不是shell为您执行此操作.例如

./calc '2 + 5 * sin 45'
Run Code Online (Sandbox Code Playgroud)

请注意单引号.这可以防止shell扩展内部任何东西.你的pgrogram然后有argc == 2,在哪里argv[1] == "2 + 5 * sin 45".