简单介绍C语言中的字符串函数
1.首先给出字符分类函数这几个就简单过一下不做重点说明。这两个为字符转换函数顾名思义没什么好介绍的接下来简单介绍几个字符串函数strlen.strcpy.strcat.strstr.strncpy.strncat.memcpy.memmove;strlen:求字符串的长度实现代码size_t my_strlen(const char* str){size_t count 0;while (*str ! \0){count;str;}return count;}这个就是用计数器的原理来计算字符串的长度当然也可以通过双指针来求。strcpy把一个字符串拷贝到另一个字符串里实现代码//char* strcpy(char* dest, char* scr)//{// assert(dest!NULL);// assert(scr!NULL);// char* cur scr;// while (*dest *scr)// {// ;// }// return cur;//}因为要返回找到这个数组所以一般重新定义一个新指针来指向开始的位置strcat把一个数组追加到另一个数组后面。代码实现char* strcat(char*dest,char*scr){assert(dest scr);char* cur dest;while (*dest ! \0)dest;while (*dest *scr);return cur;}第一个while循环找到被追加的数组的最后面第二个while开始一个个追加strstr在一个字符串中寻找另一个字符串。实现代码char* my_strstr(const char* str1, const char* str2){char* s1 NULL;char* s2 NULL;char* cur str1;while (cur){char* s1 cur;char* s2 str2;while (*s1 ! \0 *s2 ! \0 *s1 *s2){s1;s2;}if (*s2 \0){return (char*)cur;}cur;}return NULL;}int main(){char str1[] abbbcdef;char str2[] bbc;char* rel my_strstr(str1, str2);if (rel NULL){printf(找不到\n);}else{printf(%s, rel);}return 0;}strstr实现中就比较复杂了在两个字符串中找相同部分在代码中就要一一比对如果比对第一个代码时不对那就两边的指针都要加加进入下一个比较如果第一次比对成功第二次也成功后来失败了前面指针开始走的位置就需要一个新的指针来记录位置两个字符串就需要两个新指针然后strstr是成功还回成功匹配时的开始位置所以还要再建立一个新指针来记住位置如果整个字符串对比完了还没找到就还回NULL这边代码就需要3个新的指针在比对时需进行画图更加方便理解。strncpy和strncat在书写上和它们就只差n在写函数时多了个参数你n这个n是说在这个位置向后拷贝或者加上多少个字符代码跟上面的几乎差不多char* strcpy(char* dest, char* scr,int n){assert(dest!NULL);assert(scr!NULL);char* cur dest;while (n--){*dest *scr;}return cur;}int main(){int n 3;char arr1[] xxxxxxxxxxxxxxxxxxxx;char arr2[] hello world;char*relstrcpy(arr1,arr2,n);printf(%s,rel);return 0;}char* strcat(char* dest, char* scr,int n){assert(dest scr);char* cur dest;while (*dest ! \0)dest;while (n--)*dest *scr;return cur;}int main(){int n 3;char arr1[20] hello ;char arr2[] world;char* a strcat(arr1, arr2,n);printf(%s, a);return 0;}这里我就不过多赘述了。memcpy和memmove两个函数都是把一个地方的内存拷贝n个字节到另一个内存但是memmove可以处理重叠功能更加完善代码实现void* my_memcpy(void* dest, void* scr, size_t num)//num单位是字节{assert(scrdest);char* cur dest;while (num--){*((char*)dest) *((char*)scr);scr (char*)scr 1;dest (char*)dest 1;}return cur;}int main(){int arr1[] {1,2,3,4,5,6,7,8,9};int arr2[20] { 0 };my_memcpy(arr2,arr1,20);for (int i0;i10;i){printf(%d , arr2[i]);}return 0;}这里需注意拷贝是按一个字符一个字符来进行拷贝所以需要强转成char*但是如果是在同一块内存中有重合部分则会拷贝失败memmove就出来了代码实现void my_memmove(char*dest,const char*str,size_t n){assert(deststr);char* rel dest;if (deststr)//从前向后{while (n--){*dest *str;str*(char*)str 1;dest *(char*)dest 1;}}else{while (n--)//从后向前{*((char*)destn) *((char*)strn);}}return rel;}int main(){int arr[] { 1,2,3,4,5,6,7,8,9,10};my_memmove(arr 2, arr, 20);//第三个参数单位是字节for (int i0;i10;i){printf(%d ,arr[i]);}return 0;}这个就按dest和str的位置关系来考虑从前往后拷贝还是从后往前拷贝感谢观看
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2471028.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!