sizeof 和 strlen 的区别:
1. sizeof 是运算符,strlen 是函数。
2. sizeof 的参数可以是类型,可以是函数。传参时,sizeof 参数不发生降级。
strlen 的参数必须只能是 char* 类型,以 '/0' 为结尾 。传参时,strlen 参数发生降级。数组作为参数时,降为首元素地址。
3. sizeof 的返回值是 size_t 类型,返回一个变量或类型的实际大小,以字节为单位。
strlen 的返回值是 size_t 类型,返回一个计数器的结果。
4. sizeof 的结果在编译阶段就可以完成。
strlen 的结果在执行后才能完成。
模拟实现strlen的三种方法:
头文件:
1 #include<stdio.h>
2 #include<string.h>
3 #include<assert.h>
1. 使用计数器,遇到 ‘\0’为止
5 int my_strlen1(const char* str)
6 {
7 assert(str);
8 int count = 0;
9 while(*str != '\0'){
10 str++;
11 count++;
12 }
13 return count;
14 }
2. 使用头尾指针相减得到个数
16 int my_strlen2(const char* str)
17 {
18 assert(str);
19 const char* start = str;
20 while(*str != '\0'){
21 str++;
22 }
23 return str-start;
24 }
3. 使用递归,递归出口为遇见 ‘\0’
26 int my_strlen3(const char* str)
27 {
28 assert(str);
29 if(*str == '\0'){
30 return 0;
31 }
32 else{
33 return 1+my_strlen3(str+1);
34 }
35 }
测试代码:
37 void test()
38 {
39 char str[] = "abcdefgh";
40 printf("my_strlen1: [%d], my_strlen2: [%d], my_strlen3: [%d] .\n ",my_strlen1(str),my_strlen2(str),my_strlen3(str));
41 }
42
43 int main()
44 {
45 test();
46 return 0;
47 }
结果: