sizeof与strlen

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 }
结果:

猜你喜欢

转载自blog.csdn.net/Cherubim1/article/details/79792525