我正在学习C,在其中一个例子中我们编写了这样的程序:
#include <stdio.h>
int main(int argc, char *argv[])
{
// go through each string in argv
int i = 0;
while(i < argc)
{
printf("arg %d: %s\n", i, argv[i]);
i++;
}
// let's make our own array of stringd
char *states[] = {"California", "Oregon", "Washington", "Texas"};
int num_states = 4;
i = 0; // watch for this
while(i < num_states)
{
printf("state %d: %s\n", i, states[i]);
i++;
}
return 0;
}
如果我在这样的终端中运行它:
./ex11 test arguments
我得到了输出:
arg 0: ./ex11
arg 1: test
arg 2: arguments
state 0: California
state 1: Oregon
state 2: Washington
state 3: Texas
但是我不明白为什么“测试参数”部分被打印出来,我知道它与argc
和argv
有关,但我不知道如何处理。
有人可以向我解释(最好以简单的方式)吗?
答案 0 :(得分:1)
这就是你的第一个循环所做的,它遍历argv中的字符串(包含程序的名称和你输入的参数),然后将它们打印出来。 Argc是您传递的参数数量,或等效于argv的长度。
答案 1 :(得分:1)
argv是命令行参数,包括可执行文件的名称(aguments的值)。 argc是argv中的元素数量(参数计数)。
在第一个循环中,您正在打印argv的内容,因此您将获得传递给您的程序的参数。
答案 2 :(得分:1)
当命令,任何命令由Unix上的shell(实际上是任何shell)运行时,命令行将转换为字符串数组:
cmd_argv[0] = "./ex11";
cmd_argv[1] = "test";
cmd_argv[2] = "arguments";
cmd_argv[3] = NULL;
cmd_argc = 3;
然后调用:
execvp(cmd_argv[0], cmd_argv);
请注意,所有I / O重定向都被删除等。在内部,系统最终计算cmd_argv
数组开头的非空指针数,并将它们作为argv
传递给新计划,计数为argc
。新计划保证argc >= 0
和argv[argc] == NULL
。
此列表与州列表几乎相同;主要的区别是cmd_argv[cmd_argc]
是一个空指针,当然不能保证状态数据。