一.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;
}