【模拟实现strncpy】【模拟实现strncat】【模拟实现strncmp】
这三个函数都是在字节上进行实现
【strncpy】
char* strncpy(char* destination,const char* source,size_t num);
拷贝num个字符从源字符到目标空间,如果源字符串的长度小于num,则考完源字符串之后,在目标的后边追加0,直到num个。
char* my_strncpy(char* dest, const char*src, size_t num)
{
char* ret = dest;
assert(dest);//检测dest是否存在,不为NULL
assert(src);
while (num)
{
*dest++ = *src++;//一个字节一个字节拷贝
num--;
if ((*src == '\0') )
{
*dest++ = '\0';
return ret;//返回目标字符串
}
}
return ret;
}
【strncat】
char* strncat(char* destination,const char* source,size_t num);
把源字符串的num个字符拼接到目标字符串,在拼接字符串的时候,它会默认给你加上’\0’。
char* my_strncat(char* dest, const char* src, size_t num)
{
char* ret = dest;
assert(dest);//检测dest是否存在,不为NULL
assert(src);
while (*dest)
{
dest++;//先找到目标字符串的末端位置
}
while (num)
{
*dest++ = *src++;//从末端往后开始一个一个的拼接
num--;
}
*dest++ = '\0';//拼接完成后在目标字符串后加上'\0'
return ret;//返回目标字符串
}
【strncmp】
int strncmp(const char* str1,const char* str2,size_t num);
按字节比较两个字符串,比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
int my_strncmp(const char* str1, const char* str2, size_t num)
{
assert(str1);//检测dest是否存在,不为NULLw
assert(str2);
int ret = 0;
while (num)//比较num次
{
ret = *(unsigned char*)str1 - *(unsigned char*)str2;
str1++;
str2++;
if (ret < 0)
return -1;
else if (ret>0)
return 1;
}
return ret;
}
列子:
//能看出来,这个函数是将六个字符串里以A4开头的字符串找出来
int test()
{
char str[][6] = { "A499", "BF77", "3456", "A401", "A4HJ", "B612" };
int n;
puts("Looking for A4 ...\n");
for (n = 0; n < 6; n++)
{
if (strncmp(str[n], "A4xx", 2) == 0)//找到啦就打印
printf("%s\n", str[n]);
}
return 0;
}
如果有不对的地方,可以评论告诉我,望指导!