当前位置: 代码迷 >> 综合 >> 求字符串长度的 strlen 函数要注意的地方,以及用 计数器、递归、指针-指针 模拟实现 strlen 函数。
  详细解决方案

求字符串长度的 strlen 函数要注意的地方,以及用 计数器、递归、指针-指针 模拟实现 strlen 函数。

热度:88   发布时间:2023-11-22 21:39:42.0

strlen 函数是个库函数,专门求字符串长度的,我们可以先再 MSDN 上看一下它的介绍,如下:

那么大概意思懂了,直接用一下 strlen 函数吧,如下:

#include <stdio.h>
#include <string.h>  // strlen 函数头文件// 传给 strlen 函数是字符串的首地址, 然后 strlen 往后找 \0 
// strlen 函数找字符串里面 \0 之前的字符
// strlen 返回是 size_t 无符号的int main()
{char arr1[] = "zxcvbnm"; // 后面有 \0    int len = strlen(arr1);printf("%d\n", len);return 0;
}

 那么 strlen 函数介绍要以 \0 结尾是什么?我举个例子吧,如下:

    #include <stdio.h>#include <string.h>// \0 结尾的问题int mian(){// char arr2[] = { 'a', 'b', 'c', 'd' }; // 后面没有 \0 ; 会出现随机值!// int len = strlen(arr2);char arr2[10] = { 'a', 'b', 'c', 'd' }; // 虽然后面没有加 \0 但是初始化数组大小是 10 ,数组内部初始化了 a b c d 其它没有初始化部分 默认初始化 0 也就是 \0int len = strlen(arr2);printf("%d\n", len);return 0;}

 下面是返回值(size_t)的例子(易错):

    #include <stdio.h>#include <string.h>// 返回类型的问题int main(){// if(strlen("vbn") - strlen("cvbnm") > 0) // 是 3 - 5 = -2 ? 返回 <= 吗? // 错了,因为 strlen 返回 size_t 无符号的 -2 被看作无符号会是很大的数 所以是 >// 可以直接比较大小// if( strlen("vbn") > strlen("cvbnm") )  // 或者强转if((int)strlen("vbn") - (int)strlen("cvbnm") > 0){                                                  printf(">\n");}else{printf("<=\n");}return 0;}

以上就是使用 strlen 函数要注意的地方。

下面模拟一下 strlen 函数:

1. 先用计数器模拟 strlen 函数,如下:

#include <stdio.h>
#include <string.h>
#include <assert.h>  // assert 函数头文件// int My_streln(char* str)
// strlen 返回类型是 size_t 类型
// 所以可以用 size_t 也可以用 int ,我这里按照 strlen 函数原本的返回类型模拟size_t My_strlen(const char* str) // 因为指数求字符串长度 不改变原字符串 所以加 const 修饰
{assert(str != NULL); // 断言 判断指针是否为空(NULL)int count = 0;  // 计数器while(*str != '\0') // 解引用看是否为 \0 ; 不是 \0 就进入 while 循环{str++; // 不是 \0 进入 while 循环; 指针往下走一个count++; // 计数器计数}return count; // 当解引用找到 \0 ; 然后返回 count 
}int main()
{char arr1[] = "zxcvbn";int ret = My_strlen(arr1); printf("%d\n", ret);return 0;
}

2. 用递归方法模拟 strlen 函数,如下:

#include <stdio.h>
#include <string.h>
#include <assert.h> // assert 函数头文件size_t My_strlen(const char* str) // 不改变字符串 加 const 修饰
{assert(str != NULL); // 断言 判断指针是否为空if(*str != '\0') // 判断是否是 \0{return 1 + My_strlen(str+1); // 不是 \0 ; 就进来继续调用 My_strlen 函数, 调用的同时指针往后走; 直到遇到 \0 }return 0;  // 遇到 \0 ; 返回 0 ; 然后往前返回值 
}int main()
{char arr2[] = "asdfgh";int ret = My_strlen(arr2);printf("%d\n", ret);return 0;
}

3. 用指针 - 指针方法模拟 strlen 函数,如下: 

#include <stdio.h>
#include <string.h>
#include <assert.h> // assert 函数头文件size_t My_strlen(const char* str) // 不改变字符串 加 const 修饰
{assert(str != NULL);  // 断言 判断指针是否为空char* start = str;  // 先把字符串指针起始位置记下来, 赋给指针 startchar* end = str;    // 还有一个指针要往后走找 \0 , 所以再定义一个指针 end , 也是从起始位置开始while(*end != '\0') // 只要没有遇到 \0 就进入循环{end++; // 不是 \0 , 就进入循环指针就往后走}return (end - start); // 遇到 \0 了, 然后走到这里, 用 末尾位置 - 起始位置 = 字符个数
}int main()
{char arr3[] = "qwerty";int ret = My_strlen(arr3);printf("%d\n", ret);return 0;
}

以上就是 strlen 函数要注意的地方、以及用三种方法模拟实现 strlen 函数。 

  相关解决方案