模拟实现strncpy:
strncpy函数的参数有:
char* strncpy(char* destination, const char* source, size_t num);
该函数所实现的功能为:
1:拷贝num个字符从源字符串到目标空间。
2:如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
模拟实现:
char my_strncpy(char* dest, const char* src, size_t num)
{
char* ret = dest;
int i = 0;
assert(dest && src); //用assert断言保证其不为野指针
//1.用while循环实现将拷贝num个字符从源字符串到目标空间。
//设置跳出循环条件->当源字符串走到'/0'或拷贝到第num个字符
while (*src && i < num)
{
*ret++ = *src++;
i++;
}
//2.满足第2个条件->
//如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
for (int j = i; j < num; j++)
{
*ret++ = 0;
}
return ret;
}
//功能演示:
int main()
{
char arr1[20] = "Hello World";
char arr2[] = "World Hello";
my_strncpy(arr2, arr1, 5);
printf("%s\n", arr2);
return 0;
}
演示结果:
模拟实现strncat:
strncat函数的参数有:
char* strncat(char* destination, const char* source, size_t num);
该函数实现的功能为:
1:将源字符串的num个字符追加到目标字符串的结尾。
2:追加完n个字符后会自动放\0。
3:如果源字符串的长度小于num,则拷贝完源字符串之后会直接\0结尾,不会再追加。
模拟实现:
char my_strncat(char* dest, const char* src, size_t num)
{
char* ret = dest;
assert(dest && src);
//通过while循环走到目标字符串结尾('\0')处
while (*dest)
{
dest++;
}
//实现追加源字符串的num个字符到目标空间中:
//设置跳出循环条件->
//如果源字符串的长度小于num,则拷贝完源字符串之后会直接\0结尾,不会再追加
//或追加完源字符串的第num个字符至目标字符串
while (*src && num--)
{
*dest++ = *src++;
}
*dest = '\0';
return ret;
}
//功能演示:
int main()
{
char arr1[20] = "Hello ";
char arr2[20] = "World!xxx";
my_strncat(arr1, arr2, 6);
printf("%s\n", arr1);
return 0;
}
演示结果:
模拟实现strncmp:
strncmp函数的参数有:
int strncmp(const char* str1, const char* str2, size_t num);
该函数实现的功能为:
1:比较两个字符串的num个字符对应位置上字符的大小(ASCII值)
2:标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
3:比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
模拟实现:
int my_strncmp(const char *str1, const char *str2, size_t num)
{
assert(str1 && str2);
//如果传参为0,比较0个字符则直接返回0
if (num == 0)
return 0;
//设置循环跳出条件
//当str1与str2不相等时
//当str1字符为空字符串时
//当比较完对应位置的第num个字符时
while ((*str1 == *str2) && *str1 && --num)
{
str1++;
str2++;
}
//通过比较对应位置字符的ASCII值大小相减返回一个大于/小于/等于0的值
return *str1 - *str2;
}
//功能演示:
int main()
{
char arr1[20] = "aabbccdd";
char arr2[] = "aabccd";
int n = my_strncmp(arr1, arr2, 4);
printf("%d\n", n);
return 0;
}
演示结果:
这里返回的是小于0的数字也就是第四个对应位置上的str1与str2的b和c,对应位置上的ASCII值为98和99。