模拟实现C语言库函数strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove
来源:互联网 发布:淘宝绑定支付宝 编辑:程序博客网 时间:2024/05/21 06:36
C语言库函数实现练习
1.模拟实现strcpy
strcpy是字符串复制函数,把从src(源字符串指针)地址开始且含有’\0’结束符的字符串复制到以dest(目的字符串指针)开始的地址空间。
注意:在进行复制时是连字符串结束标识符‘\0’一并复制。
只能拷贝字符串。
#include<stdio.h> #include<assert.h> char *my_strcpy(char *dst, const char *src) { char *start = dst; assert(dst != NULL); assert(src != NULL); while (*dst++ = *(char*)src++) { ; } return start; //返回起始地址 } int main() { char arr1[20] = "Helloween"; char arr2[] = "Hello"; char *p = my_strcpy(arr1, arr2); printf("%s\n", p); return 0; }
2.模拟实现strcat
strcat是用于字符串连接的函数,会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。
注意:dest 与 src 所指的内存空间是不能重叠的,并且dest 要有足够的空间来容纳要复制的字符串。
#include<stdio.h>#include<assert.h>char *my_strncat(char *dst, const char *src, size_t n) { char *start = dst; assert(dst != NULL); assert(src != NULL); while (*dst) { dst++; } while (n--) { *dst++ = *(char*)src++; } return start; } int main() { char arr1[60] = "Hello, "; char arr2[] = "world"; char *p = my_strncat(arr1, arr2, 5); printf("%s\n", p); return 0; }
3.模拟实现strstr
strstr是从字符串str1中查找是否有字符串str2函数。如果str2是str1的子串,确定子串在str1中第一次出现的位置,返回这个位置的地址。
如果不是子串,返回NULL。
#include<stdio.h>#include<assert.h>#include<stdlib.h>char * my_strstr(char * dest, char * src){ char *p = dest; char *s1 = p; char *s2 = src; assert(dest); assert(src); while (*s1) { s1 = p; s2 = src; while ((*s1!='\0')&&(*s2 != '\0')) { if (*s1++ == *s2++) { ; } else { p++; break; } } if (*s2 == '\0') { return p; } }}int main(){ char *str1 = "hellow,world"; char *str2 = "world"; char *ret = my_strstr(str1, str2); printf("%s\n", ret); system("pause"); return 0;}
4.模拟实现strchr
strchr是查找字符串s中首次出现某个字符的位置。返回某字符首次出现的位置,如果字符不存在,返回NULL。
#include<stdio.h>#include<stdlib.h>#include<assert.h>char*my_strchr(const char *string,char c){ int i = 0; assert(string); while (*string!=NULL) { if (*string == c) { return string; } else { string++; } } return NULL;}int main(){ char*arr = "hellow"; char p = 'o'; char *ret = my_strchr(arr, p); printf("%s", ret); return 0;}
5.模拟实现strcmp
strcmp是比较两个字符串,若str1==str2,返回0。若str1
#include<stdio.h>#include<stdlib.h>#include<assert.h>int my_strcmp(const char *s1, const char *s2){ assert(s1); assert(s2); while ((*s1 == *s2) && (*s1 != '\0')) { s1++; s2++; } return *s1 - *s2;}int main(){ int ret = 0; char str1[40] = "helloworld"; char str2[20] = "world"; ret = my_strcmp(str1, str2); printf("%d\n", ret); system("pause"); return 0;}
6.模拟实现memcpy
memcpy是内存拷贝函数,是将N个字节的源内存地址的内容拷贝到目标内存地址中。
拷贝时会有一个变量size控制。memcpy和strcpy不同,它可以拷贝任意内容。而且strcpy复制时不指定长度,有可能会溢出。
注意!使用memcpy时要保证源和目标的内存区域不能重叠。
#include <stdio.h> #include<stdlib.h> void * my_memcpy(void * dst, const void * src, int count) { void *ret = dst; while (count--) { *(char *)dst = *(char *)src; dst=(char *)dst+1; src=(char *)src+1; } return ret; } int main() { char p[] = "hellow"; char *a = "hi"; my_memcpy(p, a, 2); printf("%s\n", p); return 0; }
memmove也是内存拷贝函数,和memcpy的作用是一样的,区别是,当内存发生局部重叠的时候memmove
可以保证拷贝结果正确,memcpy不能保证结果正确。
这种情况,不存在内存重叠,memcpy和memmove都可以保证结果正确。
这种情况下,拷贝的内容已经被覆盖,用memmove可以保证结果正确。
7.模拟实现memmove
#include <stdio.h> #include <assert.h>void * memmove(void * dst, const void * src, int count) { void * ret = dst; assert(dst); assert(src); if (dst <= src || (char *)dst >= ((char *)src + count)) { while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } } else { dst = (char *)dst + count - 1; src = (char *)src + count - 1; while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst - 1; src = (char *)src - 1; } } return ret; } int main() { char p[] = "hello!"; char *q = "world"; memmove(p, q,strlen(q)+1 ); printf("%s\n", p); return 0; }
- 模拟实现C语言库函数strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove
- 模拟实现C库函数strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove
- 模拟库函数(strcpy,strcat,strchr,strstr,strcmp,memcpy,memmove)
- 模拟实现strcpy、strcat、strstr、strchr、strcmp、memcpy、memmove
- 模拟实现C库函数:strchr、strcmp、strstr、memcpy和memmove
- 【C语言】str类与men库函数的实现(如:strcpy,strcmp,strstr,strcat,memmove,memcpy)
- 字符串函数模拟实现(strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove)
- 模拟实现strstr,strcpy,strlen,strcat,strcmp,memcpy,memmove
- 模拟实现: strstr strcpy strlen strcat strcmp memcpy memmove
- strcpy,strcmp,strstr,strcat,memcpy,memmove的模拟实现
- 模拟实现strlen,strcpy,strcat,strcmp,strstr,memcpy,memmove
- 模拟实现strcpy ,strstr,strcat,strcmp,memcpy,memmove
- 用c语言.模拟实现strcpy,strcat,strcat,memcpy,memmove
- 模拟实现函数库中的各种常用函数,1实现strcpy 2.实现strcat 3.实现strstr 4.实现strchr 5.实现strcmp 6.实现memcpy 7.实现memmove
- 模拟实现strcmp,strncmp,strstr,strcat,strncat,strcpy,strncpy,strlen ,memcpy,memmove等函数
- 字符串处理函数的模拟实现(strlen、strstr、strcat、strcmp、strcpy、memmove、memcpy)
- 模拟实现strlen/strcpy/strcat/strcmp/strstr/strchr/函数
- 字符串库函数strcpy strcmp strstr memcpy memmove等的实现
- MS COCO数据集人体关键点评估(Keypoint Evaluation)(来自官网)
- 376. Wiggle Subsequence
- 数据结构总结之最短路径
- 学习笔记10
- 个人总结69
- 模拟实现C语言库函数strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove
- Linux第四天的学习记录
- 吴恩达 神经网络和深度学习 第一部分课程 第二章课后习题 Neural Network Basics Quiz, 10 questions
- 字符串和指针
- C#实现简易计算器
- Nginx认识nginx.conf配置文件
- Struts2
- 剑指offer:面试题42——左旋转字符串
- 设计模式之工厂模式