模拟实现C库函数:strchr、strcmp、strstr、memcpy和memmove
来源:互联网 发布:上海特效牙膏知乎 编辑:程序博客网 时间:2024/05/21 14:06
功能: 查找字符串s中首次出现c字符的位置
说明: 返回首次出现c的位置的指针,返回的地址是被查找的字符串指针开始的第一个与c相同字符的指针,若s中不存在c则返回NULL。
返回值: 成功返回要查找的字符第一次出现的位置,否则返回NULL。
#define _CRT_SECURE_NO_WARNINGS 0#include <stdio.h>#include <windows.h>char *my_strchr(const char *s, char c){if (s == NULL){return NULL;}while (*s != '\0'){if (*s == c){return s;}s++;}return NULL;}int main(){char str[] = "This is a sample string";char * pch;printf("Looking for the 's' character in \"%s\"...\n", str);pch = my_strchr(str, 's');//输出每个's'的位置while (pch != NULL){printf("found at %d\n", pch - str + 1);pch = my_strchr(pch + 1, 's');}system("pause");return 0;}
返回值:返回整数值,如果dest > source,则返回值大于0,如果dest = source,则返回值等于0,如果dest < source ,则返回值小于0。字符大小是按照字符的字典序列进行排列的。
参数说明:都是以''/0''为结束符的字符串
#define _CRT_SECURE_NO_WARNINGS 0#include <stdio.h>#include <windows.h>#include <assert.h>int *my_strcmp(const char *str1, const char *str2){assert(str1);assert(str2);int ret = 0;//可以根据ret的值比较大小,进入循环是为了用ret的值来比较大小while (!(ret = *str1 - *str2) && *str1 && str2){str1++;str2++;}if ((*str1 == '\0') && (*str1 == '\0')){return 0; //一样大}else{if (ret > 0){ret = 1; //str1大}else{ret = -1; //str2大}return ret;}}int main(){//注意,判断是否相等,是比较大小,不是比较长度const char *str1 = "123456";const char *str2 = "12345678";int eq = my_strcmp(str1, str2);printf("%d\n", eq);system("pause");return 0;}
C语言库函数用于在字符串中查找子串。
函数原型:char *strstr(const char *s1, const char *s2)
函数的参数是两个字符串,函数返回s2在s1中第一次出现的位置。如果在s1中没有找到s2,返回空。
如果s2为空,则返回s1。
#define _CRT_SECURE_NO_WARNINGS 0#include <stdio.h>#include <windows.h>#include <assert.h>char *my_strstr(const char *str, const char *subStr){assert(str);assert(subStr);assert(strlen(str) >= strlen(subStr));if (*subStr == '\0')return NULL;while (*str){ const char *start = str;const char *target = subStr;while (*target) {if (*start && *target && (*start == *target)){start++;target++;}else{break;}} //到这里是遍历完所有subStr(或者target)所有字符,如果找到subStr(或者target)= \0if (*target == '\0'){return str; //找到}str++; //未找到}//以上是对str一个字符的查找return NULL; //找完str里面所有字符,未找到}int main(){char *s1 = my_strstr("abcdefg12345", "fg1");printf("%s\n", s1);char *s2 = my_strstr("abcdefg12345", "fg15");printf("%s\n", s2);system("pause");return 0;}
函数原型:void *memcpy(void*dest, const void *src, size_t n);
功能:由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。
头文件:#include<string.h>
返回值:函数返回一个指向dest的指针。
说明:
1.source和destination所指内存区域不能重叠,函数返回指向destin的指针。
2.与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。
memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;
例:
char a[100], b[50];
memcpy(b, a,sizeof(b)); //注意如用sizeof(a),会造成b的内存地址溢出。
strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例:
char a[100], b[50];
strcpy(a,b);
3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
注意:source和destination都不一定是数组,任意的可读写的空间均可。
#define _CRT_SECURE_NO_WARNINGS 0#include <stdio.h>#include <windows.h>#include <assert.h>void *my_memcpy(void *dst, const void *src, size_t count){assert(dst);assert(src);void *ret = dst;while (count--){*((char*)dst) = *((char*)src); //强转成char*后再*(解引用)才能比较dst = (char*)dst + 1; //强转成char*后指针才能向后加1src = (char*)src + 1;}return ret;}int main(){char *str = "hello world!";char arr[64];my_memcpy(arr, str, strlen(str) + 1);printf("%s\n", arr);system("pause");return 0;}
memmove 函数原型:extern void *memmove(void *dest, const void *src, unsigned int count);
头文件:#include <string.h>
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域可以重叠,但复制后src内容会被更改。函数返回指向dest的指针。
注意:
1、它的返回值是void*,参数类型也是void*,这样它才可以处理不同类型的数据。
2、目标dest不能加const,源src加const。原因是我们需要从源src中拷贝数据到dest中,需要对dest进行赋值。若用const保护 dest,便不能完成赋值操作。
memmove的好处是可以处理dest与src发生内存重叠的情况
#define _CRT_SECURE_NO_WARNINGS 0#include <stdio.h>#include <windows.h>#include <assert.h>void *my_memmove(void *dst, const void *src, size_t count){assert(dst);assert(src);assert(count > 0);char *ret = (char*)dst;char *source = (char*)src;char *destination = (char*)dst;int i = 0;while (count > 0){if (source < destination && source + count > destination){*(destination + count - 1) = *(source + count - 1);}else{*(destination + i) = *(source + i);i++;}count--;}}int main(){char str[64] = "hello world!";char arr[64];my_memmove(arr, str, strlen(str) + 1);printf("%s\n", arr);my_memmove(str + 3, str, strlen(str) + 1);printf("%s\n", str);system("pause");return 0;}
- 模拟实现C库函数:strchr、strcmp、strstr、memcpy和memmove
- 模拟实现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
- 模拟实现strcmp、strstr、memcpy、memmove
- 字符串函数模拟实现(strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove)
- 字符串库函数strcpy strcmp strstr memcpy memmove等的实现
- 【C语言】str类与men库函数的实现(如:strcpy,strcmp,strstr,strcat,memmove,memcpy)
- 模拟实现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
- 模拟实现函数库中的各种常用函数,1实现strcpy 2.实现strcat 3.实现strstr 4.实现strchr 5.实现strcmp 6.实现memcpy 7.实现memmove
- 模拟实现strstr,memcpy,memmove
- 模拟实现strcmp,strncmp,strstr,strcat,strncat,strcpy,strncpy,strlen ,memcpy,memmove等函数
- 字符串处理函数的模拟实现(strlen、strstr、strcat、strcmp、strcpy、memmove、memcpy)
- 正则表达式其实很简单
- 计算机视觉、机器学习相关领域论文和源代码大集合
- 【C++】对称矩阵
- 十六个有用的Linux命令行技巧
- FZU
- 模拟实现C库函数:strchr、strcmp、strstr、memcpy和memmove
- go语言中数组与切片的区别
- ORA-19698: D:ORACLEORADATALBMISREDO01.LOG 来自不同数据库: id=3075821044, db_ name=LBMIS
- 选择排序
- Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法
- ffmpeg系列:基于QT的播放器界面绘制
- 047day(复制构造函数和递归例题(波兰表达式)的学习)
- 考研倒计时30天的感想
- go语言中数组与切片的区别