一.strcpy的使用与模拟实现 char* strcpy(char * destination, const char * source );
使用注意事项:
• 源字符串必须以 '\0' 结束。
• 会将源字符串中的 '\0' 拷贝到目标空间。
• 目标空间必须足够大,以确保能存放源字符串。
• 目标空间必须可修改。
代码语言:javascript代码运行次数:0运行复制#include
#include
int main()
{
char dest[10];
const char *src = "hello";
strcpy(dest, src);
printf("复制的字符串:'%s'\n", dest);
return 0;
}模拟实现:
代码语言:javascript代码运行次数: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个。
代码语言:javascript代码运行次数:0运行复制#include
#include
int main()
{
char dest[10];
const char *src = "hello world";
strncpy(dest, src, 5);
dest[5] = '\0'; // 注意:必须手动添加终止空字符
// 现在 dest 是 "hello"
return 0;
}模拟实现
代码语言:javascript代码运行次数: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;
}