C语言手写strcat函数的安全版本

对原strcat的理解可以看我的另外一篇文章:

C语言字符串运算函数

可见:原strcat函数,在s1 没有足够空间时 可能会出现安全问题

//这是原strcat 函数原型
char *strcat(char *restrict s1, const char *restrict s2);

解决思路:

通过在 传值时,告诉程序可以将s2里的多少个元素拷贝到s1后面

安全版本的函数原型 :

char *my_strcat(char *s1, const char *s2, size_t n)

// size_t 是 unsigned int 类型
// 所以定义了 无符号整型 n

 例:

#include <stdio.h>
#include <string.h>

//声明函数
char *my_strcat(char *s1, const char *s2, size_t n);

int main() {
    size_t n;
    char s1[20] = "I love ", s2[20] = "Her";

    // s1 剩下可用长度
    size_t remain = sizeof(s1) - strlen(s1);
    // s2 已用长度
    size_t used = strlen(s2);

    printf("s1 还有%d个长度可用\n", remain);
    printf("s2 有%d个长度在用\n", used);
    if (remain < used) {
        printf("请输入1至%d的正整数\n", remain - used);
    } else {
        printf("请输入1至%d的正整数\n", used);
    }

    scanf("%d", &n);
    // 调用自定义函数
    my_strcat(s1, s2, n);

    printf("%s", s1);
    return 0;
}

//定义 自定义的strcat 函数
char *my_strcat(char *s1, const char *s2, size_t n) {
    //while循环 使s1地址遍历到 实际元素 结尾的地址
    while (*s1) {
        s1++;
    }

    //循环 n 遍 在s1后将n个 s2元素 赋进 s1
    for (int i = 0; i < n; ++i) {
        *s1++ = *s2++;
    }

    return s1;
}

// 运行结果
// s1 还有13个长度可用
// s2 有3个长度在用
// 请输入1至3的正整数
// 2
// I love He


版权声明:本文为m0_61879882原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。