c语言重要库函数解读 和模拟实现————常用字符串库函数
Posted 万物皆为二叉树
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言重要库函数解读 和模拟实现————常用字符串库函数相关的知识,希望对你有一定的参考价值。
字符串库函数
常用字符串库函数总结
函数用途与实现
char* strcat( char *s1, char *s2)的用途和实现
#include<stdio.h>
#include<string.h>
int main()
char arr1[20] ="abcd";
char arr2[20] ="efdg";
char* pr = NULL;
pr = strcat(arr1, arr2); // 返回一个char*指针
printf( "%s\\n",pr);
puts(pr);
return 0;
注意:
- arr1 必须规定大小 否则会非法使用空间
- 打印方式两种都可
模拟实现
#include<stdio.h>
#include<string.h>
char* My_strcat(char* p, char* r)
int i = 0;
while (*p != '\\0')
p++;
i++;
int j = 0;
char tmp = 0;
while (*r != '\\0')
*p = *r;
p++;
r++;
i++; // 计数器i 得知指针p移动的距离 在退回去
return p-i;
int main()
char arr1[20] = "ab cd"; // arr 容量不可少
char arr2[20] = "ef0ko";
char* pr=My_strcat(arr1,arr2);
printf(pr);
return 0;
char* strchr( char *s1, int ch)的用途和实现
注意 : 返回的是ch以后的字符串的地址
#include<stdio.h>
#include<string.h>
int main()
char arr[20] = "abcdef";
int ch = 'b';
char* pr = strchr(arr, ch);
printf("%p\\n", *pr);
printf(pr);
return 0;
返回的是 之后的地址
模拟实现:
char* My_strchr(char* p, int k)
while (*p != '\\0')
if (*p == k)
return p;
p++;
return NULL;
int main()
char arr[20] = "abcdef";
int ch = 'd';
char * pr = My_strchr(arr, ch);
printf(pr);
return 0;
char* strcmp( char *s1, char *s2)的用途和实现
#include<stdio.h>
#include<string.h>
int main()
char arr[20] = "adc";
char arr2[20] = 0 ;
scanf("%s", arr2);
if (!(strcmp(arr, arr2)))
printf("oppen");
else
printf("no");
return 0;
实现密码开锁 以及字符串比较
模拟实现
方法一
int My_strcmp(char* p, char* r)
int i = 0;
int j = 0;
int b = 0;
assert((*p != NULL) && (*r != NULL));
while (*(p + i) == '\\0')
i++;
while (*(p + i) == '\\0')
j++;
if (i != j)
return i - j; // 不相等返回差值
else
for (int a = 0; a < i; a++)
if (*(p + a) != *(r + a))
return 0; // 不相等返回0
return 1; // 相等返回1
int main()
char arr[20] = "abc";
char arr2[20] = "abcd";
if ((My_strcmp(arr, arr2))==1)
printf("oppen");
else
printf("no");
return 0;
方法二
#include<stdio.h>
#include<string.h>
#include<assert.h>
int My_strcmp(const char* p, const char* r)
assert ((*p != NULL) && (*r != NULL));
while (*p == *r)
if (*p == '\\0')
return 0;
p++;
r++;
return *p - *r;
int main()
char arr[20] = "abc";
char arr2[20] = "abcd";
if ((My_strcmp(arr, arr2))==0)
printf("oppen");
else
printf("no");
return 0;
char* strcpy( char *s1, char *s2)的用途和实现
复制一个字符串
#include<stdio.h>
#include<string.h>
#include<assert.h>
int main()
char arr1[20] = "abcd";
char arr2[20] = 0 ;
char*p=strcpy(arr2, arr1);
//My_strcpy(arr2, arr1);
printf(arr2);
printf("\\n");
printf(p);
return 0;
注意
- 把后面复制给前面。
- 注意分配内存 否则会照成非法内存访问
- 返回的是复制后字符串的首地址。
模拟实现
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* My_strcpy(char* r, char* p)
int c = 0;
while (*p != '\\0')
*r = *p;
p++;
r++;
c++;
return r - c;
int main()
char arr1[20] = "abcd";
char arr2[20] = 0 ;
char*p=My_strcpy(arr2, arr1);
//My_strcpy(arr2, arr1);
printf(arr2);
printf("\\n");
printf(p);
return 0;
unsigned strlen( char*s)的用途和实现
首先 strlen和sizeof的区别我已经写了专门的博客 戳这里
sizeof 和strlen
模拟实现 strlen
方法 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
int My_strlen(char* p)
int i = 0;
while (*p != '\\0')
p++;
i++;
return i;
int main()
char arr[] = "abcd";
int len = My_strlen(arr);
printf("%d", len);
return 0;
方法2 递归
#include<stdio.h>
#include<string.h>
#include<assert.h>
int My_strlen(char* p)
if (*p == '\\0')
return 0; // 出口
return 1+My_strlen(p+1);
int main()
char arr[] = "abcd";
int len = My_strlen(arr);
printf("%d", len);
return 0;
char* strstr( char *s1, char *s2)的用途和实现
#include<stdio.h>
#include<string.h>
#include<assert.h>
int main()
char arr1[20] = "abcdefg";
char arr2[20] = "def";
char* p = strstr(arr1, arr2);
printf(p);
return 0;
模拟实现
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* My_strstr(char* p, char* r)
int i = 0;
int k = 0;
while (*p != '\\0')
if (*p == *r)
r++;
i++;
p++;
else if (*r == '\\0')
return p - k;
else
p++;
k++;
if (*p == '\\0')
return p - i;
return NULL;
int main()
char arr1[20] = "abcdefg";
char arr2[20] = "bcdefg";
char* p = My_strstr(arr1, arr2);
printf(p);
if (p == NULL)
printf("heh");
return 0;
以上是关于c语言重要库函数解读 和模拟实现————常用字符串库函数的主要内容,如果未能解决你的问题,请参考以下文章