1. strcpy 函数
1.1 函数简介
strcpy 函数为 C 库函数之一,用于字符串的拷贝。
- 原型:
char* strcpy (char* dest, const char* src);
- 所属头文件:<string.h>
- 功能:将
src
指向的字符串拷贝到dest
指向的内存空间,字符串以字符'\0'
作为结尾进行判定。- 返回:指向目标字符串的指针。
1.2 函数说明
- strcpy 函数支持内存覆盖,且能正确地完成内存覆盖,即能保证目标字符串数据的完整性。当可能发生内存覆盖(源字符串在目标字符串之前)时,应先求出源字符串的长度,再定位到源字符串的结尾处与目标字符串的结尾处,最后从后向前进行字符串的拷贝。
- 在需要拷贝的字节数为已知的情况下,应尽可能以位宽为单位进行拷贝,这样能够有效提高拷贝效率。但需要拷贝的字节数为未知的情况下,如果先遍历求出需要拷贝的字节数再尽可能以位宽为单位进行拷贝,实际拷贝效率比直接以字节为单位进行拷贝的效率要低。
- 函数返回值为目标字符串是为了让函数能够支持链式表达式,例如
strlen(strcpy(..))
、printf("%s\n",strcpy(..))
等。
1.3 函数实现
char* strcpy(char* dest, const char* src)
{
// 如果两指针指向相同的内存地址,则直接返回即可
if (dest == src)
{
return dest;
}
const char* psrc = src;
char* pdest = dest;
if (src < dest)
{
/* 可能发生内存覆盖 */
// 计算源字符串长度
int len = 0;
while (*psrc != '\0')
{
len++;
psrc++;
}
// 计算出以位宽为最小单位的个数以及剩余部分的字节数
int word_num = len / sizeof(size_t);
int byte_slice = len % sizeof(size_t);