关于字符串函数的改进―(strn...函数)的自主实现,不借助库函数

问题描述:C语言中存在字符串,但其并未定义字符串类型,为便于编程人员更好操作字符串,C语言库 函数中提供了许多字符串处理函数,如:strcat函数(将目标串的内容追加到原串中),strcmp(比较两个字符串的大小),strcpy(将原串的内容拷贝到目标串中)...等等,但这些函数有一个共性,那就是程序本身并不对复制的数量进行检查,很容易造成缓冲区数据的溢出,因为循环本身只寻找‘\0’这一结束标志,所以strn..函数则利用原串或目标串的大小进行选择复制,并不依赖‘\0’,从而避免了复制数量无上限的问题。


①strncat函数实现:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>


char *my_strncat(char *dst,const char *src,int len)
{
assert((dst)&&(src));
char *q = dst;
while (*q)
{
q++;        //先遍历目标串,让指针指向目标串的‘\0’处
}
while (len--)        //len为原串的大小,以此来控制循环
{
*q = *src;    //从原目标串的‘\0’被覆盖开始,直至len为0时不再循环
q++;
src++;
}
*q = '\0'; //因为len为原串的大小,所以追加的字符数为原串的长度,而新的目标串中没有‘\0’,所以在目标串的末尾添加一个‘\0’
return dst;
}



int main()
{
char arr1[20] = "welcome";    //注意数组的大小设定,避免追加后的字符溢出
char arr2[20] = " to China!";
int len = strlen(arr2);
my_strncat(arr1,arr2,len);
printf("%s\n",arr1);
system("pause");
return 0;
}

※★注:代码中用到了strlen这一库函数用于求取原串的长度,也可自主编写字符串长度函数求取字符串长度,该函数的实现在“常见的字符串处理函数”博客一文中有详细整理,欢迎各位大神指点。


wKiom1ZQIoyhFQpMAAAW_3MKkNg176.png



②strncpy函数实现:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

char *my_strncpy(char *dst,const char *src,int len)
{
assert(dst);
assert(src);
char *q = dst;
while (len--)    //利用原串的长度作为循环次数的限制
{
*q = *src;
q++;
src++;
}
*q = '\0';    
//跳出循环时只是将原串的最后一个有效字符拷贝到目标串中,但目标串中不存在'\0',所以在目标串的末尾处追加一个结束标志
return dst;
}



int main()
{
char arr1[20] = ""; //注意目标数组的大小设置应至少能容得下原串的所有字符和‘\0’字符
char arr2[20] = "welcome to China!";
int len = strlen(arr2);
my_strncpy(arr1,arr2,len);
printf("%s\n",arr1);
system("pause");
return 0;
}

wKiom1ZQJJuxjpU3AAASxLLvJO0606.png



③strncmp函数的实现:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>


int my_strncmp(const char *src,const char *dst,int len)
{
assert(dst);
assert(src);
while (len--)
{
while (*dst && (*dst == *src))  //如果两字符相同且不为‘\0’,则指针不断移动逐一比较后续字符
{
dst++;
src++;
}
}
return (*(unsigned char *)src - *(unsigned char *)dst);   
//跳出循环时存在两种情况,一种为两字符串相同,另一种为在某处两字符不同,返回两字符的差值
}



int main()
{
/*测试用例1:
char arr1[] = "wwwworld";
char arr2[] = "wwwworld";
*/

/*测试用例2:
char arr1[] = "wwwworld";
char arr2[] = "ww";
*/

/*测试用例3:
char arr1[] = "wwww";
char arr2[] = "wwzzorld";
*/
int len = strlen(arr2);
int ret=my_strncmp(arr1,arr2,len);
printf("%d\n",ret);
system("pause");
return 0;
}

wKiom1ZQLDyToQrgAAAScaFu3R0142.pngwKiom1ZQLKOyVLQDAAAYWZ529H0484.pngwKioL1ZQLRKDWdCuAAAWgAEjFBE693.png

你可能感兴趣的:(不借助库函数)