题目
c语言模拟实现strncpy、strncat、strncmp函数
分析
strncpy、strncat、strncmp函数与strcpy、strcat、strcmp函数非常相近,但是在str…函数里,它是用依据 \0 作为结束判断的,在一些情况下这是不安全,比如在strcat函数,我们给arr追加arr时,程序就会崩溃,所以用自身的长度来作为循环停止条件是不安全的。
于是就出现了一群“strn…”函数,他们在函数拷贝的过程中,将‘\0‘也拷贝出来,并且以’\0‘作为循环的终止条件,这样子就会避免程序找不到结束条件,自己崩溃的现象。
1.一个最常见的问题,就是strn…并不能帮你保证\0结束。
2.如果源的内容比较小,而 n 又比较大的话,strn将会把之间的空间都用 \0 填充。这又出现了一个效率上的问题。
strncpy
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
char * my_strncpy(char* dest,const char* src,size_t num)
{
char * ret = dest;
assert(dest);
assert(src);
while(num--)
{
*dest++=*src++;
}
return ret;
}
int main()
{
char str1[20]={'0'};
char str2[10]="abcdefg";
int num = strlen(str2);
char *ret = my_strncpy(str1,str2,num);
printf("str1=%s",ret);
system("pause");
return 0;
}
运行结果
strncat
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
char * my_strncat(char* dest,const char* src,size_t num)
{
char * ret = dest;
assert(dest);
assert(src);
while(*dest)
{
dest++;
}
while(num--)
{
*dest++=*src++;
}
return ret;
}
int main()
{
char str1[20]="hello ";
char str2[10]="world";
int num = strlen(str2);
char *ret = my_strncat(str1,str2,num);
printf("str1=%s",ret);
system("pause");
return 0;
}
运行结果
strncmp
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
int my_strncmp(const char* dest,const char* src,size_t count)
{
assert(dest);
assert(src);
while(*dest==*src)
{
dest++;
src++;
count--;
}
return (*dest-*src);
}
int main()
{
char *str1="aaaaaaa ";
char *str2="aaabbbb";
int len=strlen(str2);
char ret = my_strncmp(str1,str2,len);
printf("%d\n",ret);
system("pause");
return 0;
}
运行结果