本章重点:
重点介绍常用处理字符串的库函数的使用以及注意事项,并且模拟实现,便于更深刻的理解下列函数。
memcpy() 求字符串长度
memmove() 复制字符串
memcmp() 比较两个字符串大小
一、memcpy()
void * memcpy ( void * destination, const void * source, size_t num );
用于从source开始拷贝num个字节到destination的内存位置
注意事项
- 如果source与destination有重叠会出现数据重叠问题,memmove很好的避免了这点
🍅模拟实现
void* my_memcpy(void* s1, void* s2,int num) { assert(s1 && &s2); void* ret = s1; while (num--) { *(char*)s1 = *(char*)s2; s1 = (char*)s1 + 1; s2 = (char*)s2 + 1; } return ret; } int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int arr2[10] = { 0 }; my_memcpy(arr2, arr, 17); //注意:这里传入17个字节,注意输出内容 for (int i = 0; i < 10; i++) { printf("%d ", arr2[i]);//因为是小端字节序所以arr2是1 2 3 4 5 0 0 0 0 0 } }
二、memmove()
void * memmove ( void * destination, const void * source, size_t num );
用于从source移动num个字节到destinaton
注意事项
- 可以处理source与destination有重叠的情况
🍎模拟实现
//模拟实现memmove void* my_memmove(void* s1,const void* s2,size_t num) { assert(s1 && s2); void* ret = s1; if (s1 < s2) { while (num--) { *((char*)s1 +num) = *((char*)s2 + num); } } else { while (num--) { *(char*)s1 = *(char*)s2; s1 = (char*)s1 + 1; s2 = (char*)s2 + 1; } } return ret; } int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,0 }; int arr2[] = { 8,8,8,8,8,8,8,8,8,8,8 }; my_memmove(arr, arr+3,12); for (int i = 0; i < 10; i++) { printf("%d", arr[i]); } }
三、memcmp()
int memcmp ( const void * ptr1,const void * ptr2,size_t num );
比较从ptr1和ptr2开始的num个字节
ptr1>ptr2 return >0的数字
ptr1=ptr2 return =0
ptr1<ptr2 return<0的数字
🦀函数用法
#include<stdio.h> #include<string.h> int main() { char str1[] = "haohaoxuexa"; char str2[] = "haohaoxuexi"; if (memcmp(str1, str2, strlen(str1)) == 0) //=0 { printf("str1 and str2 are same\n"); } else if (memcmp(str1, str2, strlen(str1)) < 0) //<0 { printf("str1 is less than str2\n"); } else { printf("str1 is greater than str2\n"); //>0 } return 0; }
完结
创作不易,还请各位小伙伴多多点赞👍关注✨收藏⭐