strlen()详解及模拟实现
什么是strlen
strlen是c语言中的库函数,其函数原型是size_t strlen (const char* str);,要注意到这里它的返回值是一个无符号整形(笔试题中可能会有陷阱!下面会讲到!)
-
具体用法如下:
#include <stdio.h> int main() { char arr[10] = { "lovec" }; int len = strlen(arr); printf("%d", len); }
控制台的输出: 函数返回的结果用len变量接收,之后打印了出来。
-
陷阱笔试题1
#include <stdio.h> #include <string.h> int main() { const char* str1 = "abcdef"; const char* str2 = "abcd"; if (strlen(str2) - strlen(str1) > 0) { printf("str2>str1 "); } else { printf("str1>str2 "); } }
这里大家是不是有小伙伴觉得atr1的长度为6大于arr2的长度4,理所应当是输出strlen(arr1)-strlen(arr2)>0呢?这就中了笔试出题者的圈套啦。我们前面提到了strlen的返回值是size_t,其实也就是无符号整型,所以无论两者的长度如何,通过strlen计算长度并将返回值相减都不会出现一个负数的。其结果肯定是一个大于等于0的值,因此在if判断语句时,其结果就为真,那么控制台输出的就是“str2>str1"。
-
陷阱笔试题2
int main() { char arr[] = { a,b,c,d,e,f}; int len = strlen(arr); printf("%d", len); return 0; }
这一题大家觉得输出又是多少呢? 是不是和上面一样为6?答案如下: 是否与大家心目中的答案一样呢?为什么会出现这么奇怪的一个数字呢?
我们在学习strlen函数时,除了返回值的类型需要注意外还要注意参数指向的字符串必须要以‘ ’结尾,否则就会在内存中继续寻找下去直到寻找到了字符串结束标志才停下。也就是说74这个结果就是在我的环境下产生的一个随机值。
模拟实现strlen
-
这个题目无论是在校园的期末考试还是公司的笔试题中都是一道比较经典的题目。
这里我们主要介绍三种主流的模拟实现的方式
-
方式一:计数器方式
int my_strlen(const char* str) { int count = 0; while (*str != ) { //指针没有走到字符串的尾部 count++;//计数器加一同时指针向后走一步 str++; } return count; } int main() { char arr[10] = { "lovec" }; int len = my_strlen(arr);//my_strlen为模拟实现strlen的函数 printf("%d", len); return 0; }
这种方式比较直观理解起来也是比较轻松的。
-
方式二:递归实现 在面试题中,出题人可能会故意刁难我们,将题目改写成不创建临时变量计数器来模拟实现strlen功能。上面的方法可就行不通了,那我们应该怎么将分数拿到手呢?
int my_strlen1(const char* str) { //递归方式实现模拟strlen if (*str == ) return 0; else return 1 + my_strlen1(str + 1);//当指针没有走到字符串尾部是 通过递归方式返回 } int main() { char arr[10] = { "lovec" }; int len = my_strlen1(arr);//my_strlen为模拟实现strlen的函数 printf("%d", len); return 0; }
-
方式三:指针相减法
int my_strlen2(const char* str) { char* right = str; char* left = str;//左指针定在首地址 while (*right != ) { //当右指针没有走到字符串尾部就继续往右走 right++; } return right - left;//两个指针相减简单来说就是差的步数 } int main() { char arr[10] = { "lovec" }; int len = my_strlen2(arr);//my_strlen为模拟实现strlen的函数 printf("%d", len); return 0; }
总结
这是我在学习中总结的一些内容,希望可以在大家学习strlen()函数时对大家有一些帮助。