自定义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
相关产品推荐
相关产品推荐

