strncpy,strncat,strncmp三者都是长度受限制的字符串函数,这些函数需要接受一个显示长度的参数,用于限定进行复制或比较的字符数,这些函数可以预防难以预料的长字符串从它们的目标数组溢出。
1.模拟实现strncpy
这个模拟函数和strcpy一样,将src的内容拷贝到dest中,但是他总是想dest写入len个字符,如果src的字符个数小于len,dest就用额外的null字节填充到len长度,如果src的字符长度大于len,那么只有len个字符被复制到src中。(注意!它的结果不会将不以nul结尾。)
#define _CRT_SECURE_NO
#include <stdio.h>
#include<Windows.h>
#include <assert.h>
#include <string.h>
char *my_strncpy( char *dest, const char *src, int num)
{
assert(dest&&src);
char *p = dest;
while (num&&(*dest++ = *src++))//拷贝个数不为零并且dest,src字符串不为零,开始拷贝
{
num--;
}
if (num>0)//num大于src长度
{
while (--num)
{
*dest++ = '\0';//dest数组用额外的nul字节填充到num字节
}
}
return p;
}
int main()
{
char arr1[80] = "1234578";
printf("string=%s ", arr1);
char arr2[] = "abcd";
int len = strlen(arr2);
char *ret=my_strncpy(arr1,arr2 , len);
arr1[len-1]='\0';//如果arr2字符过长,这条语句可以保证arr1的字符是以nul结尾,
printf("string=%s",ret);
system("pause");
return 0;
}
2.模拟实现strncat
尽管strncat也是一个长度受限制的函数,但它和strncpy不同,它从src中复制len个字符到dest中,他会在结果字符串后面加一个nul字节,而且也不会对dest进行填充,注意dest中的字符并没有算在strcat的长度中,strncat最多像dest中复制len个字符,再加一个nul字节结尾,它并不会管你dest出去原先的字符后剩下的空间够不够。
#include <stdio.h>
#include<Windows.h>
#include <assert.h>
#include <string.h>
char *my_strncat(char *dest, const char*src, int num)
{
char *p = dest;//定义一个返回指针
assert(dest&&src);
while (*dest!='\0')//将目标指针移动到目标串"\0"处
{
dest++;
}
while (num&&*src)//拷贝条件
{
*dest++ = *src++;
num--;
}
*dest = '\0';//目标串自动补'\0'
return p;
}
int main()
{
char arr1[64] = "abcd";
char arr2[] = "efghg";
int len = strlen(arr1);
char *ret= my_strncat(arr1 ,arr2, len);
printf("%s",ret);
system("pause");
return 0;
}
3.模拟实现strncmp
strncmp也用于比较两个字符,但他最多比较len个字节。如果两个字符在len个字符之前存在不相等的字符,则函数返回比较结果,若在两个字符串在前len个字符相等,函数返回零
int my_strncmp(const char*str1, const char*str2, int len)
{
assert(str1&&str2);
while (*str1 == *str2&&len)//两个字符相等,并且比较的个数不为零,继续比较
{
if (str1 == '\0')//一个字符串到最后一个字符,比较完毕,
{
return 0;
}
str1++;
str2++;
len--;
}
return *str1 - *str2;
}
int main()
{
char arr1[] = "abc";
char arr2[] = "abc";
int len = strlen(arr1);
int ret = my_strncmp(arr1, arr2, len);
printf("%d", ret);
system("pause");
return 0;
}