一、方法一(计数器)
(一)代码思路
通过遍历字符串中的字符,并计数,直到遇到字符串的结束符为止,从而得到字符串的长度。
(二)代码实现
size_t my_syrlen(const char* str)
{
size_t count = 0;
assert(str != NULL);
while (*str)
{
count++;
str++;
}
return count;
}
(三)详细逻辑
- 声明并初始化一个变量 count,用于记录字符串的长度,初始值为0。
- 使用断言 assert(str != NULL) 来确保传入的字符串指针不为空,以防止出现空指针异常。
- 进入循环,条件为 *str,即只要当前字符不是字符串的结束符('\0'),就执行循环体内的操作。
- 在循环体内,每次循环都将 count 自增1,表示已经遍历过一个字符。
- 将指针 str 向后移动一个位置,以便处理下一个字符。
- 循环结束后,返回计数器 count 的值,即得到了字符串的长度
二、方法二(指针相减)
(一)代码思路
通过将指针从字符串的起始位置移动到结束位置,然后计算两个指针之间的偏移量,从而得到字符串的长度。这种方法利用了指针的算术运算,避免了使用计数器,从而减少了代码的复杂性。
(二)代码实现
size_t my_syrlen(const char* str)
{
const char* start = str;
assert(str != NULL);
while (*str)
{
str++;
}
return str - start;
}
(三)详细逻辑
- 声明并初始化一个指针变量 start,将其指向传入的字符串 str 的起始位置。
- 使用断言 assert(str != NULL) 来确保传入的字符串指针不为空,以防止出现空指针异常。
- 进入循环,条件为 *str,即只要当前字符不是字符串的结束符('\0'),就执行循环体内的操作。
- 在循环体内,将指针 str 向后移动一个位置,以便处理下一个字符。/循环结束后,返回指针 str 与起始指针 start 之间的偏移量,即可得到字符串的长度。
三、方法三(递归)
(一)代码思路
如果当前字符是结束符,则返回0;否则,递归调用函数本身,并将指针向后移动一个位置,然后将返回结果加上1。递归调用会一直进行,直到遇到结束符,然后从最深层的递归返回,并依次累加长度,最终得到字符串的长度。
(二)代码实现
size_t my_syrlen(const char* str)
{
if (*str == '\0')
return 0;
else
return 1 + my_syrlen(str + 1);
}
(三)详细逻辑
- 首先检查当前字符是否为字符串的结束符('\0')。
- 如果是结束符,则返回0,表示字符串为空,长度为0。
- 如果不是结束符,执行递归调用。
- 递归调用的参数是字符串指针 str 加上1,即指向下一个字符的位置
- 递归调用返回的结果加上1,表示当前字符的长度。
- 最终返回的是所有字符长度的累加结果。