如何填充argv?

时间:2012-10-13 19:05:22

标签: c arrays string pointers argv

#include <stdio.h>

int main(int argc, char* argv[]){
  printf("argc: %d\n",argc);
  for(int i=0;i<sizeof(argv);i++){
    printf("argv[%d] %s\n",i,argv[i]);
  }
  return(0);
}

编译好,在GNU / linux发行版下的gnome终端下使用它

printTest one\ two three
argc: 3
argv[0] /data/local/tmp/printTest
argv[1] one two
argv[2] three
argv[3] (null)

我故意让一个白色空间逃脱,argv似乎表现得非常奇怪。

这种行为是正常的吗?什么是null?为什么argv创建一个空指针而不是只提供一个更短的数组?

4 个答案:

答案 0 :(得分:8)

sizeof(argv)没有意义 - 它是指针的大小(平台上有4个),在这种情况下恰巧恰好比argv中的值的数量多一个。

在此处使用argc

答案 1 :(得分:4)

  

这种行为是否正常?

是的,绝对的。使用one\ two指定您希望将其作为一个参数。

  

那是什么?为什么argv创建一个空指针而不是只提供一个更短的数组?

它显示数组的结尾,并且是标准所要求的。它可以循环遍历所有不使用argc的参数,例如:

while (*++argv) {
    // do something
}

但是你的代码中也有一个错误,正如duskwuff指出的那样。

答案 2 :(得分:2)

您不应该使用sizeof(argv):您只需获得系统上指针的大小,参数的数量。

另请注意,根据规范,argv[argc]NULL:无论您的转义空间或参数数量是多少,NULL都会argv[argc]。< / p>

来自 5.1.2.2.1 / 2

  

argv [argc]应为空指针。

答案 3 :(得分:1)

这是为了支持典型的C-ish习语:

for (char** arg = argv + 1; *arg; arg++)
{
    // process next arg

如您所见,argv是以0结尾的字符串数组。

将输入拆分为单独的参数是由shell完成的,语言没有定义它。

相关问题