上期博客我们主要介绍了字符串函数其中实现两个字符串比较的是 strcmp()实现两个字符串拼接的是 strcat()实现字符串拷贝的是 strcpy()。在本期博客中我们会介绍这三个函数的有限制版本函数名功能描述strncmp比较两个字符串的前 n 个字符strncat拼接两个字符串最多追加 n 个字符strncpy拷贝字符串最多拷贝 n 个字符在介绍它们自身使用的同时也会介绍它们的模拟实现。1.strncmp——比较有限个字符参数int strncmp(const char* str1, const char* str2, size_t num);比较方法以此比较 str1 和 str2 的前 num 个字符按照 ASCII 码进行比较返回值比较结果返回值str1 的前 num 个字符小于 str2 的前 num 个字符 0str1 的前 num 个字符 str2 的前 num 个字符0str1 的前 num 个字符大于 str2 的前 num 个字符 0使用#includestring.hintmain(){chararr1[]abcdg;chararr2[]abcef;intrstrncmp(arr1,arr2,3);printf(比较前三个字符的结果为%d\n,r);intpstrncmp(arr1,arr2,4);printf(比较前四个字符的结果为%d\n,p);return0;}结果模拟实现#includeassert.hintmy_strncmp(constchar*str1,constchar*str2,size_tnum){assert(str1str2);while(*str1*str2*str1!\0*str2!\0num0){str1;str2;num--;}if(num0){return0;}return*str1-*str2;}intmain(){chararr1[]abcdg;chararr2[]abcef;intrmy_strncmp(arr1,arr2,5);if(r0){printf(arr1arr2);}elseif(r0){printf(arr1arr2);}elseif(r0){printf(arr1arr2);}return0;}与strcmp的模拟实现一样只不过需要多加考虑限制条件当num0时str1 str2的每一个字符都已经比较完成了这意味它们两个字符串相等。当num0且str1 str2没有比到\0时可以开始逐个字符进行比较,相等时开始比较下一个字符直到比较完了或者是不满足循环条件。2.strncat——拼接num个字符到目标字符串的后面参数char* strncat(chardest,const charsour,size_t num)返回值返回目标字符串的首地址使用将arr2字符串的前两个字符追加到arr1的后面intmain(){chararr1[20]abcdef;chararr2[]qqqqq;strncat(arr1,arr2,2);printf(%s\n,arr1);return0;}模拟实现#includeassert.hchar*my_strncat(char*dest,constchar*sour,size_tnum){char*retdest;assert(*dest*sour);//先找到目标字符串的尾部while(*dest!\0){dest;}//找到之后开始追加while(num0*sour!\0){*dest*sour;dest;sour;num--;}//追加完成之后需要给dest后面追加一个\0*dest\0;returnret;}intmain(){chararr1[20]abcdef;chararr2[]qqqqq;my_strncat(arr1,arr2,2);printf(%s\n,arr1);return0;}先找到目标字符串的最后一个字符从这里开始拼接与strcat的模拟实现一样3.strncpy——拷贝源字符串的前num个字符到目标字符串中参数charstrncpy(chardest,const char*sour,size_t num)返回值返回目标字符串的地址使用intmain(){chararr1[]abcdefg;chararr2[20]{0};strncpy(arr2,arr1,2);printf(%s\n,arr2);return0;}模拟实现#includeassert.hchar*my_strncpy(char*dest,constchar*src,size_tn){char*retdest;assert(dest!NULLsrc!NULL);//1.源头字符串足够while(n0*src!\0){*dest*src;dest;src;n--;}//2.源头字符串不够需要用\0补while(*src\0n0){*dest\0;dest;n--;}returnret;}当出现numsour数组的字符个数时用’\0’补充