MST

星途 面试题库

面试题:C++中strcpy与memcpy在处理字符串场景下的差异

假设你有两个字符数组src和dst,src中存储了一个以null结尾的字符串。请分别使用strcpy和memcpy将src内容复制到dst,并阐述在这种字符串场景下,两者在功能、安全性等方面的差异。
25.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 使用strcpy复制字符串
#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello, World!";
    char dst[20];
    strcpy(dst, src);
    printf("Copied string using strcpy: %s\n", dst);
    return 0;
}
  1. 使用memcpy复制字符串
#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello, World!";
    char dst[20];
    size_t len = strlen(src) + 1;
    memcpy(dst, src, len);
    printf("Copied string using memcpy: %s\n", dst);
    return 0;
}
  1. 功能差异
    • strcpy:专门用于复制以null结尾的字符串。它会从源字符串的起始位置开始,逐个字符地复制,直到遇到null字符('\0'),并将null字符也复制到目标字符串中。
    • memcpy:更通用,用于复制一段内存区域。在复制字符串时,需要手动计算源字符串的长度(包括null字符)并作为参数传递,它不会自动识别null字符来停止复制,只是按照指定的字节数进行复制。
  2. 安全性差异
    • strcpy:不安全。如果目标缓冲区dst的大小不足以容纳源字符串(包括null字符),strcpy会导致缓冲区溢出,从而引发未定义行为,可能导致程序崩溃或安全漏洞,如缓冲区溢出攻击。
    • memcpy:相对安全一些,但前提是调用者正确计算了要复制的字节数。如果传递给memcpy的长度参数过大,同样可能导致缓冲区溢出。不过,只要长度计算正确,它不会像strcpy那样盲目复制而不考虑目标缓冲区大小。