用C语言编写的argc和argv []

时间:2013-12-21 22:40:12

标签: c

我正在学习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

但是我不明白为什么“测试参数”部分被打印出来,我知道它与argcargv有关,但我不知道如何处理。

有人可以向我解释(最好以简单的方式)吗?

3 个答案:

答案 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 >= 0argv[argc] == NULL

此列表与州列表几乎相同;主要的区别是cmd_argv[cmd_argc]是一个空指针,当然不能保证状态数据。