【问题标题】:Command line arguments in a C program (from a shell)C 程序中的命令行参数(来自 shell)
【发布时间】:2014-05-20 20:13:36
【问题描述】:

我正在编写一个命令行计算器。用户提供的每个表达式必须用空格分隔(这是约定)。例如:./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

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

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

【问题讨论】:

    标签: c command-line-arguments


    【解决方案1】:

    这与您的程序无关,而与您的外壳有关。

    大多数 shell 会将通配符 * 扩展为所有匹配的文件。这包括 bash 等 UNIX shell 和 Windows 的 cmd。

    对此你无能为力;这就是它的工作原理。

    另一种方法是让您的程序采用 one 参数,这是一个包含要解析的表达式的字符串。当然,您必须进行解析,而不是 shell 为您完成解析。例如

    ./calc '2 + 5 * sin 45'
    

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

    【讨论】:

      【解决方案2】:

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

      ./calc 2 + 5 '*' sin 45
      

      或转义如下:

      ./calc 2 + 5 \* sin 45
      

      最好使用不同的字符..

      【讨论】:

        【解决方案3】:

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

        grep 'some string' *
        

        shell 将* 扩展为所有文件,以便语句在所有文件中搜索“某个字符串”。在您的情况下,当您希望 shell 将 * 解释为文字字符时,您应该将其放在引号中,或者使用 \ 字符对其进行转义。

        【讨论】:

          猜你喜欢
          • 2011-04-21
          • 1970-01-01
          • 2016-02-22
          • 2010-09-18
          • 2011-08-02
          • 1970-01-01
          • 1970-01-01
          • 2014-03-06
          相关资源
          最近更新 更多