【C语言】strcpy与strncpy函数的使用和模拟实现

简介: 【C语言】strcpy与strncpy函数的使用和模拟实现

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


目录
相关文章
|
6天前
|
存储 C语言
【C语言函数】static和extern关键字修饰
【C语言函数】static和extern关键字修饰
|
3天前
|
测试技术 C语言
C语言中的void函数
C语言中的void函数
|
3天前
|
存储 安全 编译器
C语言中的scanf函数
C语言中的scanf函数
|
3天前
|
存储 搜索推荐 C语言
C语言中的指针函数:深入探索与应用
C语言中的指针函数:深入探索与应用
|
3天前
|
C语言
C语言中的无参函数
C语言中的无参函数
|
5天前
|
C语言
C语言------函数
这篇文章是C语言中函数的实训,涵盖了函数的定义、调用、自定义函数编写以及递归调用方法,并通过多个示例代码演示了如何实现累加、阶乘、斐波那契数列、特殊数列求和等函数功能。
C语言------函数
|
6天前
|
存储 程序员 编译器
[C语言]函数
[C语言]函数
|
3月前
|
存储 C语言
C 语言函数完全指南:创建、调用、参数传递、返回值解析
函数是一段代码块,只有在被调用时才会运行。 您可以将数据(称为参数)传递给函数。 函数用于执行某些操作,它们对于重用代码很重要:定义一次代码,并多次使用。
126 3
|
2月前
|
存储 C语言
C语言的函数返回值和指针
C|函数返回值(区分各类值)和指针(区分各类存储空间)的细节
|
3月前
|
存储 C语言
C语言中向函数传递值和从函数返回值的技术解析
C语言中向函数传递值和从函数返回值的技术解析
40 0