对原strcat的理解可以看我的另外一篇文章:
可见:原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版权协议,转载请附上原文出处链接和本声明。