C语言详细解读函数:strcpy()函数与strncpy()函数
💓 博客主页:Kitten饭团的CSDN主页
📁 文章专栏:C语言专栏
期待您的关注
目录
一、strcpy和strncpy函数的基本概念
1.1 函数定义
1.2 功能描述
二、strcpy函数的使用方法
三、编写strcpy函数的实现原理
四、strcpy函数的注意事项
4.1 目标缓冲区必须足够大
4.2 源字符串必须有结束符\0
string头文件其他相关库函数文章:C语言详细解读函数:strstr()函数
C语言详细解读函数:strlen()函数
C语言详细解读函数:strcmp()函数与strncmp()函数
函数概念来自于网站 https://cplusplus.com/reference/
头文件为
一、strcpy和strncpy函数的基本概念
1.1 函数定义
函数的原型:
参数说明:
🌈 函数参数 destination 的含义:一个指针,指向用于存储复制结果的目标字符数组
🌈 函数参数 source 的含义:指向待复制的字符串
🌈 函数参数 num 的含义:num指定了最多从源字符串复制多少个字符到目标数组
🌈 参数类型 const char* 的含义:const char* 表示该指针指向的内容是常量,即不能通过这个指针修改所指向的数据。
可见strcpy和strncpy的区别在于:
特性strcpystrncpy终止符处理总是复制源字符串的终止符 \0可能不添加终止符 \0缓冲区溢出防护❌ 无保护(危险)⚠️ 有限防护(需手动处理终止符)复制行为复制整个字符串直到 \0最多复制指定长度字符填充行为无若源字符串短于指定长度,填充 \0
1.2 功能描述
功能:复制字符串、复制字符串的前n个字符
实现原理:
🌈 strcpy: 从源地址开始逐个字符复制到目标地址,直到遇到并复制了源字符串的终止空字符 '\0'。返回目标数组起始地址。
🌈 strncpy复制最多 n 个字符或直到遇到源字符串的 '\0'
如果复制字符数少于 n:用空字符 '\0' 填充剩余空间;
如果源字符串长度 ≥ n:精确复制 n 个字符不添加终止空字符返回目标数组起始地址
返回值:destination
二、strcpy函数的使用方法
下面选择使用strcpy来举例,strncpy只是在此基础上加上一个参数n,整体大差不大
🌈 使用方法:
#include
#include
int main()
{
char str1[20] = "Hello";
char str2[20] = "World!";
printf("str1[10] = %s\n", str1);
strcpy( str1, str2 );
printf("str1[10] = %s\n", str1);
return 0;
}
🌈 打印结果:
三、编写strcpy函数的实现原理
🌈 内部实现机制:根据函数的基本概念来写一个自己的 strcpy函数
🌈 示例代码:
#include
#include
/**
* @brief 复制字符串
* @note None
* @param dest:指向目标内存,存储复制的字符串
* @param src: 指向待复制的字符串
* @retval 成功:返回一个指针,指向复制后的字符串,等价于dest
失败:返回NULL
*/
char* MyLib_StrCpy(char *dest, const char *src)
{
// 1、检查指针有效性
if (dest == NULL || src == NULL)
{
return NULL;
}
// 2、复制字符串内容
char *orig_dest = dest; // 保存原始指针用于返回
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = '\0'; // 手动添加字符串结束符
// 3、返回原始的dest指针
return orig_dest;
}
int main()
{
char str1[20] = "Hello";
char str2[20] = "World!";
printf("str1[10] = %s\n", str1);
MyLib_StrCpy( str1, str2 );
printf("str1[10] = %s\n", str1);
return 0;
}
四、strcpy函数的注意事项
相比较strcpy,strncpy需要注意的事项少一些,这里列举几个关于strcpy平时可能遇见比较多的注意事项 。
4.1 目标缓冲区必须足够大
就像装水的桶,目标缓冲区必须比源字符串大至少1位(多出来的位置放)
🌈 错误示例:
char name[5]; // 只能装4个字符+1个\0
strcpy(name, "Alexander"); // 溢出!后果严重
4.2 源字符串必须有结束符\0
strcpy通过 \0 判断何时停止复制
🌈 错误示例:
char no_end[3] = {'A','B','C'}; // 没有\0
strcpy(buffer, no_end); // 会一直复制直到遇到内存中的\0 → 可能崩溃
strcpy函数和strncpy函数的内容到此结束了,要是有不足希望各位能够在评论区指出,要是文章对你有帮助,可以给个免费的赞和收藏💞💞💞