目录
1.strncpy
重点:
模拟实现:
2.strncat
重点:
模拟实现:
3.strncmp
重点:
模拟实现:
写在最后:
1.strncpy
该函数包含三个参数,前两个参数与上一篇文章中讲解的strcpy函数一样,一个目的地,一个源,第三个为要拷贝的字节数 (注意这里是字节数!)
重点:
1. 拷贝num个字符从源字符串到目标空间。
2. 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
1.
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[15] = "abcdefghij";
char arr2[] = "1234";
strncpy(arr1, arr2, 4);
printf("%s\n", arr1);
return 0;
}
从arr2中拷贝4个字节的内容到arr1,只会覆盖掉前4个字节的内容,不会全部覆盖。
2.
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[15] = "abcdefghij";
char arr2[] = "1234";
strncpy(arr1, arr2, 6);
printf("%s\n", arr1);
return 0;
}
这里我们要从arr2中拷贝6个字节的内容到arr1,但是arr2中只有4个字节的内容,所以拷贝完arr2的内容后要在后面追加两个0;
'\0'的ASCII码值就是0,所以打印arr1时,会提前终止打印。
模拟实现:
创建一个my_strncpy函数,模拟实现strncpy函数的功能:
其实与模拟实现strcpy函数类似,只不过多了一个控制拷贝多少个字节的参数而已~
#include <stdio.h>
#include <assert.h>
char* my_strncpy(char* dest, const char* src, size_t num)//返回值类型参数类型与原函数保持一致
{//dest所指向的字符串需要被修改,不用const保护,src所指向的字符串不需要被修改用const修饰保护
assert(dest && src);//断言一下,保证两个指针均不为空指针,若为空指针则中止程序并报错
char* ret = dest;//创建一个char*变量保存起始地址,后面需要返回起始地址
while (num--) //控制拷贝几个字节
{
*dest = *src; //拷贝
if (*src != '\0') //若src所指向的字符串没有到'\0'就继续++
src++; //++,指向下一个字符
dest++; //++,指向下一个字符
}
return ret; //返回字符串起始位置
}
int main()
{
char arr1[] = "abcdefg";
char arr2[] = "1234";
printf("%s\n", my_strncpy(arr1, arr2, 6));
return 0;
}
2.strncat
该函数包含三个参数,前两个参数与上一篇文章中讲解的strcat函数一样,一个目的地,一个源,第三个为要追加的字节数 (注意这里是字节数!)
重点:
1. 在目标字符串后面追加num个字节
2. 追加是从目标字符串最后的'\0'开始追加的,同时追加完成后会自动在最后补上一个'\0'
3. 如果源字符串的长度小于num,则就只追加完源字符串,再补上一个'\0'就结束了
4. 可以用该函数自己给自己追加
1.
int main()
{
char arr1[15] = "abcdef";
char arr2[] = "abcd";
strncat(arr1, arr2, 2);
printf("%s\n", arr1);
return 0;
}
在arr1后面追加两个字节的arr2的内容。
2.
由上面两个步骤的对比,可以很清晰地看出追加是从目标字符串最后的'\0'开始追加的。
int main()
{
char arr1[15] = "abcdef\0xxxx";
char arr2[] = "abcd";
strncat(arr1, arr2, 2);
printf("%s\n", arr1);
return 0;
}
在arr1字符串中间加上一个'\0'那么就会从这个'\0'处开始追加,我们可以看到追加完"ab"后,又追加了一个'\0'。
3.
int main()
{
char arr1[15] = "abcdef\0xxxxxx";
char arr2[] = "abcd";
strncat(arr1, arr2, 6);
printf("%s\n", arr1);
return 0;
}
如果源字符串的长度小于num,则就只追加完源字符串,再补上一个'\0'就结束了
4.
int main()
{
char arr[10] = "abc";
strncat(arr, arr, 3);
return 0;
}
用该函数自己给自己追加是安全的
模拟实现:
创建一个my_strncat函数,模拟实现strcat函数的功能:
char* my_strncat(char* dest, const char* src, size_t num)
{
assert(dest && src);
char* ret = dest; //上面的代码与前一个模拟实现的函数原因相同,这里就不多赘述了
while (*dest != '\0') //找到dest指针指向的字符串的末尾的'\0'
dest++;
while (num--) //控制追加几个字节
{
*dest = *src; //追加
if (*src == '\0') //若src指向'\0',就直接返回终止函数,此时'\0'已经追加完成了
return ret;
dest++; //++,指向下一个字符
src++; //++,指向下一个字符
}
*dest = '\0'; //追加完成后再在最后追加一个'\0'
return ret; //返回字符串的起始地址
}
int main()
{
char arr1[15] = "abcdef\0xxxxxx";
char arr2[] = "1234";
printf("%s\n", my_strncat(arr1, arr2, 3));
return 0;
}
3.strncmp
该函数包含三个参数,前两个参数与上一篇文章中讲解的strcmp函数一样,一个目的地,一个源,第三个为要比较的字节数 (注意这里是字节数!)
返回值为int类型,与strcmp函数一样,
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
重点:
比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
1. 当两个字符串前num个字符相等时
2. 当前一个字符串大于后者时
3. 当前一个字符串小于后者时
模拟实现:
创建一个my_strncmp函数,模拟实现strncmp函数的功能:
int my_strncmp(const char* str1, const char* str2, size_t num)
{
assert(str1 && str2); //上面的代码与前一个模拟实现的函数原因相同,这里就不多赘述了
while (num--) //控制比较的字节数
{
if (*str1 == *str2) //比较字符
{
if (*str1 == '\0')//判断是否已经比较到了末尾,若为'\0'则表示两字符串相等
return 0;
str1++;
str2++;
}
else
return *str1 - *str2;//若两字符不同就直接返回两字符差值
}
return 0; //若能走到这就说明两字符串所比较的这几个字节的字符时相同的
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abccdg";
printf("%d\n", my_strncmp(arr1, arr2, 4));
return 0;
}
写在最后:
本节内容已经讲完,下篇会继续讲解字符串相关函数,期待围观学习!!!