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

标签 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(当然这个程序编译的文件夹包含所有三个文件)。我应该在单独的文件夹中编译它吗?我尝试了这种方法,但仍然存在“计算”

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

最佳答案

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

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

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

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

./calc '2 + 5 * sin 45'

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

关于C 程序中的命令行参数(来自 shell),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23769046/

相关文章:

c - SDL2 音频问题 C 编程(不是混音器)

c - 如何重写程序,以便不必调用 `flex` 而只调用 `bison` 和 `cc` ?

java - main 函数可以使用 String 而不是 String[]

c - 如何在 Codesys v3 中创建指向函数的指针

c - 链表递归反向函数的问题

c - 修改C中链表中的数据?

xcode - 终端中的 "./"和 "open"有什么区别,如何从 XCode 运行 Unix 可执行文件?

Java:检查命令行参数是否为空

docker - 如何使用docker参数作为其内部函数的参数

c - 是否可以通过内联汇编访问硬件寄存器