gpt4 book ai didi

c - strlen() 在此代码中真正应该返回什么?

转载 作者:行者123 更新时间:2023-12-02 05:28:16 27 4
gpt4 key购买 nike

#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 中有四个元素,数组 qqq 中有五个元素,最后一个元素是 '\0'。所以我理解 A 行打印 4,C 行打印 5。 D线对我来说没问题。我知道 strlen(qqq) 在处理字符串时等于 "sizeof qqq/sizeof qqq[0] - 1"。但是 B 行打印 15 这让我感到困惑。为什么? (我用的是vs2012。)

最佳答案

在你的代码中

  char qq[] = {'a' , 'b' , 'c' , 'd'};

qq 没有资格称为 string,因为它不是以 null 结尾的。所以用qq调用strlen()是自找麻烦。

这里实际发生的是,strlen() 越过 qq 中的最后一个有效元素来寻找终止 null(实际上是缺失的),因此,冒险进入越界内存,调用undefined behaviour .

解决方案:要使qq 成为字符串,您必须自己在初始化列表中添加空终止符,例如

 char qq[] = {'a' , 'b' , 'c' , 'd', '\0'};

就是说,正如我在评论中提到的那样,strlen()返回类型为size_t,您应该使用%zu 格式说明符来打印结果。


只是心情比较轻松,来回答一下

what should strlen() really return in this code?

如果我说,“尊敬的印度总统的电话号码”,好吧,从技术上讲,我可能是正确的!!

严肃地说,UB 的输出是未定义的。

关于c - strlen() 在此代码中真正应该返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32052286/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com