前言
C语言中有着字符类型,但是没有字符串类型。库函数中有着许多处理字符和字符串的函数供我们使用。
字符串可以放在字符数组中,也可以放在常量字符串中。
1. strlen()函数
1.1 strlen()的函数声明
stelen()
函数接收一个字符串的地址,返回字符串的长度,返回类型是size_t
。
size_t
类型就是unsigned int
类型。
- 字符串以
'\0'
作为结束标志,返回的是在字符串中'\0'
前面出现的字符个数。不包含字符'\0'
。- 参数指向的字符串必须要以
'\0'
结束。- 函数的返回值是
size_t
,是无符号的。
2.2 模拟实现
2.2.1 计数法
//模拟实现strlen
#include <stdio.h>
#include <assert.h>
//计数法
size_t my_strlen1(const char* str) {
//断言,如果str是空指针就报错
assert(str);
//记录字符串的长度
size_t count = 0;
//一个循环,直到字符串为'\0'时结束循环并停止计数
while (*str) {
str++;
count++;
}
return count;
}
int main() {
char str[] = { "abcdef" };
int ret1 = my_strlen1(str);
printf("%d\n", ret1);
return 0;
}
运行结果:
2.2.2 指针相减法
//模拟实现strlen
#include <stdio.h>
#include <assert.h>
//指针相减法
size_t my_strlen2(const char* str){
//断言,如果str是空指针就报错
assert(str);
//创建一个字符指针,指向字符串的首元素
const char* start = str;
//如果当前字符不是'\0',指针就指向下一个字符串
while (*str != '\0') {
str++;
}
//两个指针相减,且是高地址减去低地址,得到二者之间的字符个数
return str - start;
}
int main() {
char str[] = "abcdef";
int ret2 = my_strlen2(str);
printf("%d\n", ret2);
return 0;
}
运行结果:
2.2.3 递归法
//模拟实现strlen
#include <stdio.h>
#include <assert.h>
//递归法
size_t my_strlen3(const char* str) {
//断言,如果str是空指针就报错
assert(str);
//递归要有渐进条件和出口。
//如果当前指针指向字符不是'\0',就要记录并且计算指针指向下一个字符的字符串的大小
//如果是'\0',就不记录并返回0。
if (*str) {
return my_strlen3(str + 1) + 1;
}
else {
return 0;
}
}
int main() {
char str[] = "abcdef";
int ret3 = my_strlen3(str);
printf("%d\n", ret3);
return 0;
}
运行结果:
结语
多种方法模拟实现库函数之strlen()
。
END