MST

星途 面试题库

面试题:C语言字符串函数strcpy的注意要点及实现

请简述C语言中strcpy函数在使用时需要注意哪些关键点,并尝试自己实现一个类似strcpy功能的函数,说明实现过程中可能遇到的问题及解决方法。
31.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

strcpy函数使用关键点

  1. 目标缓冲区大小:目标缓冲区必须足够大,以容纳源字符串及其结束符'\0',否则会导致缓冲区溢出,引发未定义行为。
  2. 源字符串有效性:源字符串必须以'\0'结尾,否则strcpy会持续复制,直到遇到内存中的某个'\0'字符,这可能导致访问越界。
  3. 指针合法性:传递给strcpy的源字符串指针和目标缓冲区指针都必须是有效的,不能为NULL,否则会导致程序崩溃。

实现类似strcpy功能的函数

#include <stdio.h>
#include <assert.h>

char* my_strcpy(char* dest, const char* src) {
    assert(dest != NULL && src != NULL);
    char* ret = dest;
    while ((*dest++ = *src++) != '\0');
    return ret;
}

实现过程中可能遇到的问题及解决方法

  1. 空指针检查:如果传入的destsrcNULL指针,程序会崩溃。解决方法是使用assert宏或者在函数开始处手动检查指针是否为NULL,如果是则返回合适的值(例如NULL)并进行错误处理。
  2. 缓冲区溢出:若目标缓冲区dest空间不足,会导致数据覆盖其他内存区域。这需要调用者确保dest有足够空间。在实际应用中,可以通过预先计算源字符串长度并结合目标缓冲区大小来避免。
  3. 自我复制:如果源字符串和目标字符串重叠,my_strcpy函数可能无法正确工作。要处理这种情况,可使用memmove函数的思路,从后往前复制,但对于简单的strcpy实现一般不考虑这种复杂情况,因为strcpy假设源和目标不重叠。