#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创建一个空指针而不是只提供一个更短的数组?
答案 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完成的,语言没有定义它。