目录
前言:
回顾一下:昨天我们了解到了strcpy函数,它是一个用于字符串拷贝的函数,但是strcpy函数有安全风险,因为它并不检查目标字符串的长度,是否足够容纳源字符串的副本,可能导致写入溢出。如果不能保证不会发生溢出,就需要使用今天要介绍的strncpy函数。
一、引用头文件
所有的库函数都要引用头文件,字符串类函数也一样,它们的头文件均为<cstring> (string.h)
引用方式如下:
C语言
#include <string.h>
C++
#include <cstring>
二、strncpy函数的作用
strcpy函数用于将源头指针指向的字符串拷贝其中指定个数的字符到目标指针所指向的位置中。这个函数相比strcpy函数有更高的安全性,一定程度上防止了溢出的情况。
三、理解strncpy函数的定义
char * strncpy ( char * destination, const char * source, size_t num );
1、返回类型
在C语言标准库函数的定义中,strncpy函数的返回类型为char*(一个字符指针),用于返回指向目标字符串的地址,也就是用于传址调用的destination指针,这和strcpy函数相同。
2、参数
在C语言标准库函数的定义中,strncpy函数的参数有三个,第一个为char* destination(指向目标位置的字符指针),第二个为const char* source(指向源头位置的字符指针),该参数前加上了const使其具备了常属性--不可被更改,一定程度上提高了函数的安全性,这前两个参数与strcpy相同,第三个参数为size_t num(表示拷贝的字符的个数)。
四、使用strncpy函数
1、编写程序
#include <string.h>
#include <stdio.h>
int main()
{
char arr1[] = "hello world";
char arr2[20] = "#############";//方便后期调试观察
char* ret = strncpy(arr2, arr1, 5);
printf("%s\n", arr2);
printf("%s\n", ret);
return 0;
}
2、调试运行(使用VS2022)
调试控制台:
监视器:
由此可看出strncpy并不会在拷贝字符后加上‘\0’(字符串结束标准),所以当我们要拷贝字符串片段没有结束标志'\0'时,我们要手动在末尾加上'\0'。
五、注意要点
1、虽然strncpy函数可以在参数中指定拷贝字符个数,以此防止溢出现象,但我们写入拷贝字符个数时也要考虑一下目标位置是否可以放下。
2、当我们要拷贝字符串片段没有结束标志'\0'时,我们要手动在末尾加上'\0'。(重复一遍以示重要性)
六、模拟实现
#include <stdio.h>
#include <assert.h>
char* my_strncpy(char* dest,const char* src,size_t num)
{
assert(dest && src);
char* ret = dest;
while (num--)//设置拷贝num次
{
*dest = *src;
dest++;
src++;
}
return ret;
}
int main()
{
char arr1[] = "hello world";
char arr2[20] = "#############";//方便后期调试观察
char* ret = my_strncpy(arr2, arr1, 5);
printf("%s\n", arr2);
printf("%s\n", ret);
return 0;
}
每日一学,今天你又超过了百分之九十九的人。
如果本篇文章对你有帮助,请点个关注和赞吧!