strlen()在这段代码中应该返回什么? #包括 #包括 #包括 内部主(空) { 字符qq[]={'a','b','c','d'}; 字符qqq[]=“abcd”; printf(“%d\n”,sizeof qq/sizeof qq[0]);//行A printf(“%d\n”,strlen(qq));//行B printf(“%d\n”,sizeof qqq/sizeof qqq[0]);//行C printf(“%d\n”,strlen(qqq));//第d行 系统(“暂停”); 返回0; }
看看上面的代码。数组strlen()在这段代码中应该返回什么? #包括 #包括 #包括 内部主(空) { 字符qq[]={'a','b','c','d'}; 字符qqq[]=“abcd”; printf(“%d\n”,sizeof qq/sizeof qq[0]);//行A printf(“%d\n”,strlen(qq));//行B printf(“%d\n”,sizeof qqq/sizeof qqq[0]);//行C printf(“%d\n”,strlen(qqq));//第d行 系统(“暂停”); 返回0; },c,sizeof,strlen,C,Sizeof,Strlen,看看上面的代码。数组qq中有四个元素,数组qqq中有五个元素,最后一个元素是'\0'。所以我知道A行打印4,C行打印5。D线对我来说没问题。我理解在处理字符串时,strlen(qqq)等于“sizeof qqq/sizeof qqq[0]-1”。但是B行打印的是15,这让我感到困惑。为什么?(我在代码中使用vs2012。) #include <stdio.h> #include <stdlib.h> #include <string.h> int main(v
qq
中有四个元素,数组qqq
中有五个元素,最后一个元素是'\0'
。所以我知道A行打印4
,C行打印5
。D线对我来说没问题。我理解在处理字符串时,strlen(qqq)等于“sizeof qqq/sizeof qqq[0]-1”
。但是B行打印的是15
,这让我感到困惑。为什么?(我在代码中使用vs2012。)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char qq[] = {'a' , 'b' , 'c' , 'd'};
char qqq[] = "abcd";
printf("%d\n" , sizeof qq / sizeof qq[0]); // line A
printf("%d\n" , strlen(qq)); // line B
printf("%d\n" , sizeof qqq / sizeof qqq[0]); // line C
printf("%d\n" , strlen(qqq)); // line D
system("pause");
return 0;
}
qq
不适合称为字符串,因为它不是以null结尾的。因此,用qq
调用strlen()会带来麻烦
这里实际发生的情况是,strlen()
通过qq
中的最后一个有效元素来搜索终止null(它实际上丢失了),因此,冒险进入越界内存,该内存调用
解决方案:要使qq
成为字符串,您必须自己在初始值设定项列表中添加空终止符,如
char qq[] = {'a' , 'b' , 'c' , 'd'};
也就是说,正如我在评论中已经提到的,由于返回类型是size\u t
,您应该使用%zu
格式说明符来打印结果
只是以轻松的心情回答 strlen()在这段代码中应该返回什么 如果我说“尊敬的印度总统的电话号码”,那么,从技术上讲,我可能是对的
值得注意的是,UB in的输出是未定义的。
strlen
将继续前进,直到找到一个\0
字符,计算沿途有多少个字符
由于qq
中没有\0
,因此strlen
将继续进入其他不相关的内存。最后,它偶然遇到一个\0
字节
显然,对于您来说,这是在15个字节之后(或超出qq
末尾11个字节之后)。但它不是确定性的或有保证的,而且非常不安全。
很有可能
strlen
在找到\0
字符之前尝试读取无效内存,在这种情况下,您的程序将出现故障。您的字符串不是以null结尾的。这意味着您的代码不是确定性的strlen()
将在遇到\0
(空字节/字符)时终止;在遇到\0
之前,由于顺序扫描,结果可能会有所不同。strlen()
计算字符串的长度,但char qq[]={'a','b','c','d'代码>不是字符串。当“非字符串”
数据被传递到strlen
时,将获得未定义的结果
字符串在c
中以null结尾
它应该是charqq[]={'a','b','c','d','\0'}
注意:strlen()
返回size\u t
,因此您应该使用%zu
格式说明符。对于运算符的大小,同样的方法是使用s%zu而不是%d或%ld,因为长的未签名intIt可能会打印任何内容strlen()
将愉快地继续在内存中移动,直到找到一个0。只是碰巧在15个字节中找到了一个。
char qq[] = {'a' , 'b' , 'c' , 'd', '\0'};