面试题答案
一键面试- 功能差异:
strcpy()
:- 用于将一个以
'\0'
结尾的字符串复制到另一个字符数组中。它会从源字符串的起始位置开始,逐个复制字符,直到遇到'\0'
,并将'\0'
也复制到目标数组中。 - 例如,
char src[] = "hello"; char dest[10]; strcpy(dest, src);
,此时dest
数组中的内容为"hello\0"
。
- 用于将一个以
memcpy()
:- 用于从源内存地址的起始位置开始,复制指定长度的字节数到目标内存地址。它不会关心数据中是否包含
'\0'
,只按照指定的字节数进行复制。 - 例如,
int arr1[] = {1, 2, 3}; int arr2[3]; memcpy(arr2, arr1, sizeof(arr1));
,这里arr2
就复制了arr1
的所有内容,不会受'\0'
等特殊字符影响。
- 用于从源内存地址的起始位置开始,复制指定长度的字节数到目标内存地址。它不会关心数据中是否包含
- 适用场景:
- 优先使用
strcpy()
的场景:- 当明确处理以
'\0'
结尾的字符串,并且希望将整个字符串(包括'\0'
)复制到目标数组时使用。例如,在字符串拼接、字符串初始化等操作中。假设要将一个字符串常量复制到一个字符数组中作为初始化,char s1[20]; const char* s2 = "world"; strcpy(s1, s2);
。
- 当明确处理以
- 优先使用
memcpy()
的场景:- 复制非字符串类型的数据,如整数数组、结构体等。比如有一个结构体
struct Point { int x; int y; }; struct Point p1 = {1, 2}; struct Point p2; memcpy(&p2, &p1, sizeof(struct Point));
,这里复制结构体时memcpy()
能保证准确复制所有成员,而strcpy()
不适用。 - 当需要复制部分字符串或者要精确控制复制的字节数,而不依赖
'\0'
作为结束标志时,也使用memcpy()
。例如,char src[] = "abcdef"; char dest[4]; memcpy(dest, src, 3); dest[3] = '\0';
,这样就可以只复制src
的前3个字符到dest
并手动添加'\0'
使其成为字符串。
- 复制非字符串类型的数据,如整数数组、结构体等。比如有一个结构体
- 优先使用