一.strcpy的使用与模拟实现
char* strcpy(char * destination, const char * source );
使用注意事项:
• 源字符串必须以 '\0' 结束。
• 会将源字符串中的 '\0' 拷贝到目标空间。
• 目标空间必须足够大,以确保能存放源字符串。
• 目标空间必须可修改。
#include <stdio.h> #include <string.h> int main() { char dest[10]; const char *src = "hello"; strcpy(dest, src); printf("复制的字符串:'%s'\n", dest); return 0; }
模拟实现:
char *my_strcpy(char *dest, const char*src) { char *ret = dest; assert(dest != NULL); assert(src != NULL); while((*dest++ = *src++)) { ; } return ret; }
strcpy 不检查目标缓冲区的大小,因此如果目标缓冲区不够大,可能会导致缓冲区溢出,这是一个严重的安全风险。建议使用 strncpy并指定最大复制长度,以避免这种风险。
二.strncpy的使用与模拟实现
char * strncpy ( char * destination, const char * source, size_t num );
使用注意事项:
- 拷贝num个字符从源字符串到目标空间。
- 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
#include <stdio.h> #include <string.h> int main() { char dest[10]; const char *src = "hello world"; strncpy(dest, src, 5); dest[5] = '\0'; // 注意:必须手动添加终止空字符 // 现在 dest 是 "hello" return 0; }
模拟实现
char *my_strncpy(char *dest, const char *src, size_t n) { char *dest_save = dest; while (n && *src) { *dest++ = *src++; n--; } while (n--) { *dest++ = '\0'; // 如果 n 大于 src 字符串的长度,填充剩余位置为空字符 } return dest_save; }