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'};