南昌小程序开发定制,网站建设优化论坛,wordpress本文链接,免费采购信息平台C语言程序设计笔记---026 C语言之模拟实现strncpy函数、strncat函数、strncmp函数、strstr函数1、介绍strncpy函数1.1、模拟实现strncpy函数 2、介绍strncat函数2.1、模拟实现strncat函数 3、介绍strncmp函数3.1、模拟实现strncmp函数 4、介绍strstr函数4.1、模拟实现strstr函数… C语言程序设计笔记---026 C语言之模拟实现strncpy函数、strncat函数、strncmp函数、strstr函数1、介绍strncpy函数1.1、模拟实现strncpy函数 2、介绍strncat函数2.1、模拟实现strncat函数 3、介绍strncmp函数3.1、模拟实现strncmp函数 4、介绍strstr函数4.1、模拟实现strstr函数 5、结语 C语言之模拟实现strncpy函数、strncat函数、strncmp函数、strstr函数
前言 通过C语言字符串函数的知识这篇将对strncpy、strncat、strncmp函数进行深入学习底层原理的知识并模拟实现对应功能。
/知识点汇总/ 长度不受限制的字符串函数strcat,strcmp,strcpy 介绍长度受限制字符串函数strncat,strncmp,strncpy 字符串查找函数strstr
1、介绍strncpy函数
函数原型char* strncpy(char* strDest, const char* strSource, size_t count); 函数功能完成源字符串到目标字符串的拷贝返回目标字符串的起始地址返回值类型为char*另外还可指定拷贝的长度 头文件string.h 使用注意事项 (1)、源字符串必须以’\0’结束因为会包括’\0’一起拷贝过去 (2)、拷贝会将源字符串中的’\0’拷贝到目标空间 (3)、目标空间必须足够大确保能存放源字符串 (4)、目标空间必须可变(不能是常量) (5)、初始化为数组形式时空间需要指明合适的大小 示例代码1如下
#include stdio.h
#include string.h
int main()
{char arr1[20] { 0 };char arr2[] abcdefghi;strncpy(arr1, arr2, 3);printf(%s\n, arr1);//abcchar arr1[20] xxxxxxxxxxxxxxx;char arr2[] abcdefghi;strncpy(arr1, arr2, 3);printf(%s\n, arr1);//abcxxxxxxxxxxreturn 0;
}示例代码2如下 探讨拷贝长度的因素当指定的拷贝长度比源字符串长度大时自动补\0
#include stdio.h
#include string.hint main()
{char arr1[20] xxxxxxxxxxxx;char arr2[] abc;strncpy(arr1, arr2, 6);//6长度比str2长时自动补的\0.printf(%s\n, arr1);//abc\0\0\0return 0;
}1.1、模拟实现strncpy函数
#include stdio.h
#include assert.h
char* my_strncpy(char* str1, const char* str2, size_t num)
{assert(str1 str2);char* ret str1;while (num--){*str1 *str2;}return ret;
}
int main()
{char arr1[] abcdef;char arr2[] defabc;printf(请输入拷贝的字符串长度:);size_t len 0;scanf(%zd, len);printf(%s\n, my_strncpy(arr1, arr2,len));return 0;
}解释说明 1.assert是断言参数为指针防止传参过来是空指针避免野指针的问题 2.用一个指针变量始终保存目标字符串的起始地址以免目标起始地址发生改变导致函数的返回值错误 3.num–执行的就是依次拷贝字符串的内容直到num 0,从而限制了拷贝个数最后跳出while循环
2、介绍strncat函数
函数原型char* strncat(char* strDest, const char* strSource, size_t count); 函数功能完成源字符串到目标字符串的追加返回目标字符串的起始地址返回值类型为char*另外还可指定追加的长度 头文件string.h 使用注意事项 (1)、源字符串必须以’\0’结束因为会包括’\0’一起追加过去 (2)、追加会将源字符串中的’\0’拷贝到目标空间 (3)、目标空间必须足够大确保能存放源字符串 (4)、目标空间必须可变(不能是常量) (5)、初始化为数组形式时空间需要指明合适的大小 示例代码1如下
#include stdio.h
#include string.h
int main()
{char arr1[20] abc;char arr2[] defghi;strncat(arr1, arr2, 3);printf(%s\n, arr1);//abcdefreturn 0;
}示例代码2如下 探究’\0’的追加情况1
#include stdio.h
#include string.h
int main()
{char arr1[20] abc\0xxxxxxxxxxx;//字符串中本身具备\0时依然以\0开始覆盖最后补\0结束char arr2[] defghi;strncat(arr1, arr2, 3);printf(%s\n, arr1);//abcdef\0return 0;
}示例代码3如下 探究’\0’的追加情况2
#include stdio.h
#include string.h
int main()
{char arr1[20] abc\0xxxxxxxxxxx;//字符串中本身具备\0时依然以\0开始覆盖最后补\0结束char arr2[] defghi;strncat(arr1, arr2, 10);//10长度比str2长时自动在末尾补\0.此函数就不会对超出长度的字符进行操作了printf(%s\n, arr1);//abcdefreturn 0;
}小结 ①、目标字符串中本身具备’\0’时依然以’\0’开始覆盖最后补’\0’结束 ②、指定长度长度比源字符串长时自动在末尾补’\0’且此函数就不会对超出长度的字符进行操作了
2.1、模拟实现strncat函数
#include stdio.h
#include assert.h
char* my_strncat(char* str1, const char* str2, size_t num)
{assert(str1 str2);char* ret str1;while (*str1 ! \0){str1;}//*str1--;while (num--){*str1 *str2;}*str1 \0;return ret;
}
int main()
{char arr1[10] abc;char arr2[10] abc;printf(请输入追加的字符串长度:);size_t len 0;scanf(%zd, len);printf(%s\n, my_strncat(arr1, arr2, len));return 0;
}解释说明 1.assert是断言参数为指针防止传参过来是空指针避免野指针的问题 2.用一个指针变量始终保存目标字符串的起始地址以免目标起始地址发生改变导致函数的返回值错误 3.str1 ! \0’执行的就是指针遍历目标字符串的内容直到目标字符串的下一个地址,从而再以num–限制追加的字符长度 4.值得注意的是str1 ‘\0’最后需要置结束标志位否则就是乱码因为直到遇见’\0’才结束。
3、介绍strncmp函数
函数原型int strncmp( const char *string1, const char *string2, size_t count ); 函数功能字符串大小比较返回值类型为int另外还可指定比较的长度 头文件string.h 示例代码1如下
#include stdio.h
#include string.h
int main()
{char arr1[] abcdef;char arr2[] abcqw;int ret strncmp(arr1, arr2, 3);printf(%d\n, ret);//0int ret2 strncmp(arr1, arr2, 4);printf(%d\n, ret2);//-1return 0;
}3.1、模拟实现strncmp函数
#include stdio.h
#include assert.h
int my_strncmp(const char* str1,const char* str2, size_t num)
{assert(str1 str2);while (num *str1 *str2){if (*str1 *str2){return 1;}if (*str1 *str2){return -1;}num--;str1;str2;}return 0;
}
int main()
{char arr1[] abcdef;char arr2[] defabc;printf(请输入比较的字符串长度:);size_t len 0;scanf(%zd, len);printf(%d\n, my_strncmp(arr1, arr2,len));return 0;
}解释说明 1.assert是断言参数为指针防止传参过来是空指针避免野指针的问题 2.用一个指针变量始终保存目标字符串的起始地址以免目标起始地址发生改变导致函数的返回值错误 3.num *str1 *str2执行的就是依次比较字符串的内容直到源字符串/目标字符串/指定字符长度 0结束,从而限制了比较字符个数最后跳出while循环
4、介绍strstr函数
函数原型const char *strstr( const char *string, const char *strCharSet ); 函数功能在字符串中找字符串字符串中找子字符串或子段 头文件string.h 返回值strstr会返回主字符串中子字符串第一次出现的位置如果主字符串中没有子字符串则返回NULL 示例代码1如下
#include stdio.h
#include string.h
int main()
{char arr1[] abcdefghi;char arr2[] def;char* ret strstr(arr1, arr2);if (ret NULL){printf(找不到\n);}else{printf(%s\n, ret);//defghi}return 0;
}4.1、模拟实现strstr函数
蛮力法直接遍历查找
#include stdio.h
#include assert.h
const char* my_strstr(const char* str1, const char* str2)
{assert(str1 str2);const char* cp;//记录开始匹配的位置const char* s1;//遍历str1指向的字符串const char* s2;//遍历str2指向的字符串if (*str2 \0)return str1;cp str1;while (*cp){s1 cp;s2 str2;while (*s1 *s2 *s1 *s2){s1;s2;}if (*s2 \0)return cp;cp;}return NULL;
}
int main()
{char arr1[] abcdefghi;char arr2[] def;const char* ret my_strstr(arr1, arr2);if (ret NULL){printf(找不到\n);}else{printf(%s\n, ret);//defghi}return 0;
}解释说明 1.assert是断言参数为指针防止传参过来是空指针避免野指针的问题 2.定义三个指针变量cp用于标记返回的起始地址s1和s2用于遍历str1和str2逐个比较即可 3.*s1 *s2 *s1 *s2执行的就是依次比较字符串的内容直到子字符串与主字符串内容匹配则结束,最后跳出while循环返回cp的地址。
5、结语
掌握模拟函数的逻辑思维尽可能考虑全面学会利用画逻辑图分析并一步步的推理 学习函数的最实用的方式就是用自己的逻辑简单实现一些类似的功能 半亩方糖一鉴开天光云影共徘徊。 问渠哪得清如许?为有源头活水来。–朱熹观书有感