1

如果我写:

char  lili [3];
cout<<strlen(lili)<<endl;

然后打印的是:11

但如果我写:

char  lili [3];
lili [3]='\0';
cout<<strlen(lili)<<endl;

然后我得到3。

我不明白为什么它在第一部分返回 11?
strlen 不应该返回 3,因为我为 分配了 3 个字符lili吗?

4

4 回答 4

8

这是因为strlen适用于“C 风格”以空字符结尾的字符串。如果您像在第一个示例中那样给它一个普通指针或未初始化的缓冲区,它将继续在内存中前进,直到它 a) 找到 a \0,此时它将返回该“字符串”的长度,或 b) 直到它到达受保护的内存位置并产生错误。

鉴于您已标记此 C++,也许您应该考虑使用std::array或更好,std::string. size()两者都提供长度返回函数(

于 2012-06-27T08:55:52.900 回答
5

strlen函数搜索设置为 的字节\0。如果在未初始化的数组上运行它,则行为未定义。

于 2012-06-27T08:55:24.100 回答
2

你必须先初始化你的数组。否则里面有随机数据。

strlen正在寻找一个字符串终止符号并将计数直到找到它。

于 2012-06-27T08:54:54.133 回答
2

strlen 计算字符数,直到达到 '\0'(表示“字符串结尾”)。在 C 和 C++ 中,char[] 等价于 char *,strlenlili用作指向 char 的指针并迭代它所指向的内存,直到它到达终止的 '\0'。碰巧内存中有 0 个字节,而为您的数组分配的内存中有 11 个字节。你可能会得到更奇怪的结果。

实际上,当您编写 lili[3] = '\0' 时,您会访问数组之外​​的内存。C/C++ 中 3 元素数组的有效索引为 0-2。

于 2012-06-27T09:04:44.610 回答