命令行参数 argv 和 argc
command line arguments argv and argc
我知道 argc
计算参数的数量,而 argv
接受参数,但这是我可以确定我的 argv
的参数是否输入的方法某些格式如括号中而不是括号中。比如./a.out "Hello Word"
和./a.out Hello World
?
是也不是。基本上唯一的方法是用像 strcmp
这样的函数进行字符串比较。但是,使事情复杂化的一件事是您使用的 shell 可能会在您的程序有机会看到它们之前删除引号。更糟糕的是,如何处理取决于 shell,因此对一个 shell 有效的方法可能对另一个无效。 Posix shells(sh、bash、ksh 等等)以相同的方式处理引号,但不提供任何检测方式。
这个节目:
#include <stdio.h>
int main(int argc, char **argv)
{
printf("Number of arguments: %d\n", argc);
for(int i=0; i<argc; i++)
printf("Argument %d: %s\n", i, argv[i]);
}
当使用 shell bash: 时, 产生星号作为参数的输出
/tmp/test$ ./a.out *
Number of arguments: 3
Argument 0: ./a.out
Argument 1: a.out
Argument 2: main.c
这是因为 *
由 shell 扩展到当前目录中的所有文件。引号通常将原本会被视为两个不同论点的事物组合在一起。如果您想将引号传递给 bash,您可以转义它们。
/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 可能会提供执行此操作的工具,但并不能保证,即使他们提供了,也没有标准的方法来执行此操作。
我知道 argc
计算参数的数量,而 argv
接受参数,但这是我可以确定我的 argv
的参数是否输入的方法某些格式如括号中而不是括号中。比如./a.out "Hello Word"
和./a.out Hello World
?
是也不是。基本上唯一的方法是用像 strcmp
这样的函数进行字符串比较。但是,使事情复杂化的一件事是您使用的 shell 可能会在您的程序有机会看到它们之前删除引号。更糟糕的是,如何处理取决于 shell,因此对一个 shell 有效的方法可能对另一个无效。 Posix shells(sh、bash、ksh 等等)以相同的方式处理引号,但不提供任何检测方式。
这个节目:
#include <stdio.h>
int main(int argc, char **argv)
{
printf("Number of arguments: %d\n", argc);
for(int i=0; i<argc; i++)
printf("Argument %d: %s\n", i, argv[i]);
}
当使用 shell bash: 时,产生星号作为参数的输出
/tmp/test$ ./a.out *
Number of arguments: 3
Argument 0: ./a.out
Argument 1: a.out
Argument 2: main.c
这是因为 *
由 shell 扩展到当前目录中的所有文件。引号通常将原本会被视为两个不同论点的事物组合在一起。如果您想将引号传递给 bash,您可以转义它们。
/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 可能会提供执行此操作的工具,但并不能保证,即使他们提供了,也没有标准的方法来执行此操作。