strcpy、strcpy_s、strncpy、strncpy_s 字符串拷贝用法

本文主要讲解了C/C++中的字符串复制函数strcpy、strcpy_s、strncpy和strncpy_s的区别,着重强调了strcpy_s的安全特性以及strncpy_s在避免缓冲区溢出上的优势。通过实例展示了如何选择合适的函数以确保字符串操作的正确性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、strcpy
原型声明:

char *strcpy(char* dest, const char *src);

功能:将以src为首地址的字符串复制到以dst为首地址的字符串,包括’\0’结束符,返回指向dest的指针。
不安全原因:依据源串的\0作为结束判断的,不会检查需要拷贝的缓冲区的大小,如果目标空间不够,就有溢出问题。
局限:只能将两个字符串进行完整的复制和赋值,不能实现仅复制某个字符串的前几个字符。
要求:src和dst所指内存区域不可以重叠且dst必须有足够的空间来容纳src的字符串。
头文件:c++: #include c:#include <string.h>

2、strcpy_s
strcpy_s和strcpy的主要区别:strcpy函数没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串。用strcpy_s就可以避免这些不可预料的行为。当存在缓存区溢出的问题时(即src的长度大于dst的长度),strcpy_s()会抛出异常;而strcpy()结果则未定,因为它错误地改变了程序中其他部分的内存的数据,可能不会抛出异常但导致程序数据错误,也可能由于非法内存访问抛出异常。
原型:
三个参数时:

strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );

两个参数时:

strcpy_s( char (&strDestination)[size], const char *strSource ); // C++ only

风险:非C标准函数

2、strncpy
原型:

char *strncpy(char *dest, const char *src, size_t n)

功能:
从以src为首地址的字符串中至多复制n个字符到以dst为首地址的字符串,返回指向dest的指针。具体而言:如果在[0,n]之间没有’\0’结束符,则dst中没有结束符;如果遇到空字符(‘\0’),则把\0复制进去,空字符后面为原来的字符;如果src<n个字节,则以NULL填充dest直到复制完n个字节;如果src>n的长度,只是将src的前n个字符复制到dest的前n个字符,不自动添加’\0’(即结果dest不包括’\0’,需手动添加’\0’),dst输出时会出现乱码,直至碰到’\0’结束符为止。
要求:
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符长度+‘\0’。
strncpy和strcpy的主要区别:strncpy多了一个参数n(第3个参数),可以指定要从src(源字符串)拷贝的字符个数。
风险:strncpy 不检查 dest 中是否有足够的空间,这将潜在导致缓冲区溢出。
头文件:来自C语言标准库,定义于 string.h
举例:

char s[20];
strcpy_s(s, sizeof(s), "AA BB CC"); // "AA BB CC"
strncpy(s, "tt", 2); // "tt BB CC" 
strncpy(s, "rr", 3); // "rr" 

4、strncpy_s
原型:

strncpy_s(char * str2, int size2, char * str1, int size1);

简而言之,如果你想寻求一种安全的字符串拷贝方法,可以:

//dst是字符数组char[]
std::string idString = "abc";
strncpy(dst, idString.c_str(), sizeof(dst) - 1);
dst[sizeof(dst) - 1] = 0;

参考:https://www.cnblogs.com/fortunely/p/14515340.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值