经常听身边的朋友说去参加公司笔试时会遇到要求实现c语言中的库函数(strlen strcpy strncpy strcat strncat strcmp strncmp),有时会想不起来该如何写,那么我们今天就来实现下这几个库函数。( 如有错误,欢迎指出!!!)
1 size_t mystrlen(const char *str){
2 if(str==NULL){ //也可以使用assert assert(str!=NULL);但需要加assert.h头文件
3 return -1;
4 }
5 size_t cnt = 0;
6 while(*str!='\0'){
7 cnt++;
8 str++;
9 }
10 return cnt;
11 }
12
13
14 int main(){
15 char s[100] = "abcdefg";
16 printf("库函数:%u\n",strlen(s));
17 printf("自定义函数:%u\n",mystrlen(s));
18 return 0;
19 }
调用库函数与自定义函数比较,结果相同(注意:strlen所统计的字符串长度不包括结尾 的’\0’!)。
strcpy是将第二个字符串全部拷贝到第一个字符串中,如果第二个字符串长度小于第一个,则只第一个多出的部分不再显示。strncpy有三个参数,将第二个字符串的n位拷贝到第一个字符串。
char *mystrcpy(char *str_1,const char *str_2)
char *mystrncpy(char *str_1,const char *str_2,size_t n)
15 char *mystrcpy(char *str_1,const char *str_2){
16 if(str_1==NULL||str_2==NULL){
17 return NULL;
18 }
19 char *pstr_1 = str_1;//后面程序会使指针偏移,所以先保存初始位置
20 while(*str_2!='\0'){
21 *str_1 = *str_2;;
22 str_1++;
23 str_2++;
24 }
25 *str_1 = '\0';
26 return pstr_1;
27 }
28
29 int main(){
30 char s1[100] = "hello world";
31 char s2[100] = "hello java";
32 printf("库函数:%s\n",strcpy(s1,s2));
33 char s3[100] = "hello world";
34 char s4[100] = "hello java";
35 printf("自定义函数:%s\n",mystrcpy(s3,s4));
29 char *mystrncpy(char *str_1,const char *str_2,size_t n){
30 if(str_1==NULL||str_2==NULL){
31 return NULL;
32 }
33 char *pstr_1 = str_1;//保存初始位置
34 size_t i = 0;
35 while(i<n&&*str_2!='\0'){
36 *str_1 = *str_2;
37 str_1++;
38 str_2++;
39 i++;
40 }
41 return pstr_1;
42
43 }
62 int main(){
63 char s1[100] = "hello world";
64 char s2[100] = "hello java hello python";
65 printf("库函数:%s\n",strncpy(s1,s2,8));
66 char s3[100] = "hello world";
67 char s4[100] = "hello java hello python";
68 printf("自定义函数:%s\n",mystrncpy(s3,s4,8));
69 return 0;
70 }
~
char *mystrcat(char *str_1,const char *str_2)
char *mystrncat(char *str_1,const char *str_2,size_t n)
44 char *mystrcat(char *str_1,const char *str_2){
45 if(str_1==NULL||str_2==NULL){
46 return NULL;
47 }
48 char *pstr_1 = str_1;//保存初始位置
49 while(*str_1!='\0'){ //将str_1移到末尾
50 str_1++;
51 }
52 while(*str_2!='\0'){
53 *str_1 = *str_2;
54 str_1++;
55 str_2++;
56 }
57 *str_1 = '\0';
58 return pstr_1;
59
60 }
61
62 int main(){
63 char s1[100] = "hello ";
64 char s2[100] = "world";
65 printf("库函数:%s\n",strcat(s1,s2));
66 char s3[100] = "hello ";
67 char s4[100] = "world";
68 printf("自定义函数:%s\n",mystrcat(s3,s4));
69 return 0;
70 }
62 char *mystrncat(char *str_1,const char *str_2,size_t n){
63 if(str_1==NULL||str_2==NULL){
64 return NULL;
65 }
66 char *pstr_1 = str_1;//保存初始位置
67 size_t i = 0;
68 while(*str_1!='\0'){ //将str_1移到末尾
69 str_1++;
70 }
71 while(i<n&&*str_2!='\0'){
72 *str_1 = *str_2;
73 str_1++;
74 str_2++;
75 i++;
76 }
77 *str_1 = '\0';
78 return pstr_1;
79 }
80 int main(){
81 char s1[100] = "hello ";
82 char s2[100] = "world";
83 printf("库函数:%s\n",strncat(s1,s2,2));
84 char s3[100] = "hello ";
85 char s4[100] = "world";
86 printf("自定义函数:%s\n",mystrncat(s3,s4,2));
87 return 0;
88 }
int mystrcmp(const char *str_1,const char *str_2)
int mystrncmp(const char *str_1,const char *str_2,size_t n)
81 int mystrcmp(const char *str_1,const char *str_2){
82 if(str_1==NULL||str_2==NULL){
83 return -1;
84 }
85 while(*str_1!='\0'&&*str_2!='\0'&&*str_1==*str_2){
86 str_1++;
87 str_2++;
88 }
89 return *str_1 - *str_2;
90 }
91 int main(){
92 char s1[100] = "hello";
93 char s2[100] = "hellw";
94 if(strcmp(s1,s2)==0){
95 printf("库函数判断:相同\n");
96 }else if(strcmp(s1,s2)>0){
97 printf("库函数判断:s1>s2\n");
98 }else{
99 printf("库函数判断:s1);
100 }
101 if(mystrcmp(s1,s2)==0){
102 printf("自定义函数判断:相同\n");
103 }else if(mystrcmp(s1,s2)>0){
104 printf("自定义数判断:s1>s2\n");
105 }else{
106 printf("自定义函数判断:s1);
107 }
108
92 int mystrncmp(const char *str_1,const char *str_2,size_t n){
93 if(str_1==NULL||str_2==NULL){
94 return -1;
95 }
96 while(n>1&&*str_1!='\0'&&*str_2!='\0'&&*str_1==*str_2){//库函数1是起始位,不是0
97 str_1++;
98 str_2++;
99 n--;
100 }
101 return *str_1 - *str_2;
102 }
103 int main(){
104 char s1[100] = "hellok";
105 char s2[100] = "hellow";
106 if(strncmp(s1,s2,5)==0){
107 printf("库函数判断:相同\n");
108 }else if(strncmp(s1,s2,5)>0){
109 printf("库函数判断:s1>s2\n");
110 }else{
111 printf("库函数判断:s1);
112 }
113 if(mystrncmp(s1,s2,5)==0){
114 printf("自定义函数判断:相同\n");
115 }else if(mystrncmp(s1,s2,5)>0){
116 printf("自定义数判断:s1>s2\n");
117 }else{
118 printf("自定义函数判断:s1);
119 }
120
121 return 0;
122 }