C - 命令行参数 argv 和 argc



我知道argc计算参数的数量并argv接受参数,但是它们是我可以确定我的argv参数是否以某种格式输入的方法,例如在括号中而不是在括号中。如./a.out "Hello Word"./a.out Hello World

是和否。基本上,执行此操作的唯一方法是与strcmp之类的函数进行字符串比较。但是,使问题复杂化的一件事是,您正在使用的 shell 可能会在您的程序有机会看到引号之前删除引号。更糟糕的是,如何处理这取决于 shell,因此对一个 shell 有效的方法可能对另一个 shell 无效。Posix shell(sh,bash,ksh等(以相同的方式处理报价,并且不提供任何检测它的方法。

此程序:

#include <stdio.h>
int main(int argc, char **argv)
{
printf("Number of arguments: %dn", argc);
for(int i=0; i<argc; i++)
printf("Argument %d: %sn", i, argv[i]);
}

在使用外壳 bash 时,为星号作为参数产生此输出:

/tmp/test$ ./a.out *
Number of arguments: 3
Argument 0: ./a.out
Argument 1: a.out
Argument 2: main.c

这是因为 shell 会*扩展到当前目录中的所有文件。引号通常将原本被视为两个不同参数的事物分组。如果你想传递引号来抨击,你可以转义它们。

/tmp/test$ ./a.out "Hello world"
Number of arguments: 2
Argument 0: ./a.out
Argument 1: Hello world
/tmp/test$ ./a.out "Hello world"
Number of arguments: 3
Argument 0: ./a.out
Argument 1: "Hello
Argument 2: world"

所以不幸的是,答案是否定的。没有通用的方法可以执行此操作。一些 shell 可能会提供工具来执行此操作,但无法保证,即使它们这样做,也没有标准的方法可以做到这一点。

最新更新