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

时间:2014-05-20 20:13:36

标签: 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;
}

该示例表达式的输出为:

Number of arguments: 10
Argument: ./calc
Argument: 2
Argument: +
Argument: 5
Argument: calc
Argument: calculate.c
Argument: lab2
Argument: sin
Argument: 45

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

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

3 个答案:

答案 0 :(得分:6)

这与您的程序无关,也与您的shell无关。

大多数shell将通配符*扩展为所有匹配的文件。这包括像bash这样的UNIX shell,以及Windows&#39; cmd

你无能为力;它是如何运作的。

替代方案是让您的程序使用一个参数,该参数是包含要解析的表达式的字符串。当然,您必须进行解析,而不是shell为您执行此操作。 E.g。

./calc '2 + 5 * sin 45'

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

答案 1 :(得分:3)

这是由于*字符的命令行扩展(与当前文件夹中的所有文件匹配)。尝试引用它:

./calc 2 + 5 '*' sin 45

或以下列方式转义:

./calc 2 + 5 \* sin 45

最好使用不同的角色..

答案 2 :(得分:2)

*字符是大多数shell上的特殊字符。在Linux中,shell将其解释为“当前目录中的所有内容”,并在将其提供给命令之前对其进行扩展。这就是你如何使用这样的命令:

grep 'some string' *

shell扩展*以表示所有文件,因此语句在所有文件中搜索“some string”。在您的情况下,当您希望shell将*解释为文字字符时,您应该将其放在引号中,或者使用\字符将其转义。