char p[4]={'h','g','y'};
cout<<strlen(p);
此代码打印3。
char p[3]={'h','g','y'};
cout<<strlen(p);
这打印8。
char p[]={'h','g','y'};
cout<<strlen(p);
再次打印8。
请帮助我,因为我无法弄清楚为什么通过改变阵列的大小来打印三个不同的值。
答案 0 :(得分:27)
strlen
从给定指针开始并前进,直到到达字符'\0'
。如果您的数组中没有'\0'
,则可能任何数字,直到达到'\0'
。
达到您要查找的数字的另一种方法(在您显示的情况下)是使用:int length = sizeof(p)/sizeof(*p);
,它将为您提供数组的长度。但是,这并不是strlen
定义的字符串长度。
正如@John Dibling所提到的,strlen
给出第一个例子的正确结果的原因是你为4个字符分配了空间,但只使用了3个字符;剩下的1个字符会自动初始化为0,这正是'\0'
寻找的strlen
字符。
答案 1 :(得分:4)
只有你的第一个例子有一个空终止的字符数组 - 另外两个例子没有空终止,所以你不能以明确定义的方式对它们使用strlen()
。
char p[4]={'h','g','y'}; // p[3] is implicitly initialized to '\0'
char p[3]={'h','g','y'}; // no room in p[] for a '\0' terminator
char p[]={'h','g','y'}; // p[] implicitly sized to 3 - also no room for '\0'
请注意,在最后一种情况下,如果您使用字符串文字初始化数组,则会得到一个空终止符:
char p[]= "hgy"; // p[] has 4 elements, last one is '\0'
答案 2 :(得分:1)
那会给你一个随机数。 strlen
要求字符串以'\0
'终止才能生效。
答案 3 :(得分:1)
试试这个:
char p[4]={'h','g','y', '\0'};
答案 4 :(得分:1)
strlen
是一个标准库函数,可以与字符串一起使用(在术语的C意义上)。 String 定义为char
值的数组,以\0
值结尾。如果您向<{1}}提供的内容不是字符串,则行为未定义:代码可能会崩溃,代码可能会产生无意义的结果等。
在您的示例中,只有第一个提供带有字符串的strlen
,这就是它按预期工作的原因。在第二种情况和第三种情况下,您提供的不是字符串(不以strlen
结尾),这就是为什么结果没有意义。
答案 5 :(得分:0)
'\0'
终止你的char缓冲区。
char p[4]={'h','g','y', '\0'};
答案 6 :(得分:0)
这是因为strlen()希望为字符串找到一个空终止符。在这种情况下,您没有它,因此strlen()会一直计数,直到找到\ 0或者提供内存访问冲突并且您的程序死亡。 RIP!