MST

星途 面试题库

面试题:C++ 中 strcpy() 与 memcpy() 功能差异及使用场景

请详细阐述 C++ 中 strcpy() 和 memcpy() 函数在功能上的具体差异,并且举例说明在何种编程场景下应优先使用 strcpy(),何种场景下应优先使用 memcpy()。
15.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 功能差异
    • 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'等特殊字符影响。
  2. 适用场景
    • 优先使用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'使其成为字符串。