【发布时间】:2012-06-16 17:21:25
【问题描述】:
所以我想知道命令行参数是否总是以空值结尾?谷歌似乎同意了,在 GCC 上编译表明情况确实如此,但我能保证这始终是真的吗?
int main(int argc, char** argv)
{
char *p;
for(int cnt=1; cnt < argc; ++cnt)
{
p = argv[cnt];
printf("%d = [%s]\n", cnt, p);
}
return 0;
}
$ MyProgram -arg1 -arg2 -arg3
1 = -arg1
2 = -arg2
3 = -arg3
【问题讨论】:
-
想一想:如果它们不被 NULL 终止会发生什么?
-
想一想... char[] 和 char* 不会自动暗示 C 风格的字符串。显然,整个命令行字符串都是以 NULL 结尾的,但不必转换为在命令行上传递的每个单独的字符数组都以 NULL 结尾。对于 argv 来说,只需去除命令行上的空格并具有非空终止字符数组而不是 C 样式字符串就很容易了。
-
@LeviX - 如果字符数组不是 NULL 终止的,你怎么能检测到它们字符数组的结尾?
-
@shf301 啊,好吧,我明白你的意思了。字符* argv[]。如果它们不是空终止的,你怎么知道一个从哪里开始,另一个从二维数组开始。明白了,我站得更正了,现在这是有道理的。谢谢。
-
@LeviX 这是关于知道每个字符串在哪里结束并能够将其传递给每个其他需要 NUL 终止符的 C 函数。它与数组中的字符串无关。像
char* argv[]这样的数组不是二维数组;它是一个指针数组。 (当然在真正的二维数组中,每个字符串的长度必须相同,所以我们不需要终止符?)指向的对象不必彼此相邻。即:这里,不要求每个连续指针所指向的地址必须在 NUL 终止先前编号的参数之后的 1 个字节。
标签: c argv null-terminated