You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义myStrLen函数返回值存疑:是否需包含'\0'的字节数?

关于自定义字符串函数的长度计算问题

嗨,我来帮你理清这个容易混淆的点!首先得明确C语言里标准strlen()的核心行为:它统计的是从字符串起始地址开始,直到但不包含终止符'\0'的字符数量——这是关键,很多新手会在这里搞混。

咱们逐个解决你的疑问:

1. "HELLO WORLD!"的长度到底是多少?

字符串"HELLO WORLD!"在内存中的存储是:{'H','E','L','L','O',' ','W','O','R','L','D','!','\0'},一共13个字节(包括末尾的'\0')。但标准strlen()会返回12,因为它不把终止符计入长度。你之前以为的13是整个数组的字节数,不是字符串的逻辑长度。

2. 没有'\0'的数组算不算合法字符串?

你提到的数组{'H','E','L','L','O',' '}是没有终止符'\0'的,这根本不是一个合法的C字符串!标准strlen()遇到这种情况会越界访问内存,直到随机找到一个'\0'为止,结果是完全不可预测的(未定义行为)。

你的myStrLen()返回6,说明你的函数可能是直接遍历了数组的所有元素——这其实是在计算数组的元素个数,而不是实现标准strlen()的功能。

3. 到底该返回i还是i+1?

如果你的目标是实现标准strlen(),那正确的逻辑应该是:

int myStrLen(const char *s) {
    int i = 0;
    // 遍历直到遇到'\0',不包括'\0'本身
    while (s[i] != '\0') {
        i++;
    }
    // 此时i的值就是'\0'之前的字符数,直接返回i即可
    return i;
}

举个例子:如果传入的是合法字符串"HELLO"(内存是{'H','E','L','L','O','\0'}),循环会在i=5时停止(因为s[5]是'\0'),返回5——这和标准strlen()的结果一致。

如果你的数组没有'\0',那这个函数的行为是危险的,必须确保传入的是带终止符的合法字符串。

额外提一下其他两个函数的注意点

  • mystrcopy:要把源字符串的所有字符(包括'\0')复制到目标缓冲区,或者至少复制到源的'\0'为止,并在目标末尾手动添加'\0',否则目标会变成无终止符的非法字符串。
  • mystrcat:首先要找到目标字符串的'\0'位置,然后把源字符串的字符(不包括源的'\0')从这个位置开始复制,最后在拼接后的末尾添加'\0'。

内容的提问来源于stack exchange,提问作者Vincent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:16:57