鱼C论坛

 找回密码
 立即注册
查看: 2584|回复: 6

[已解决]关于字符拼接的问题,缓存区溢出

[复制链接]
发表于 2023-1-16 21:09:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

int main()
{
    char str1[] = "I love";
    char str2[] = "FishC.com!";

    strcat_s(str1,sizeof(str1)+1, " ");
    strcat_s(str1,sizeof(str1)+sizeof(str2), str2);
   
    printf("%s\n", str1);

    return 0;
}

    strcat_s(str1,sizeof(str1)+1, " ");//问题在这一行:为什么写入str1时缓冲区会溢出呢?


跟着b站上视频学到这里,用的是vs2022,和gcc编译器用命令行操作相比,vs感觉更好上手一些。但是经常发生和视频里不一样的错误。。。
最佳答案
2023-1-16 21:36:48
不同编译器严格性不一样。这很正常。
#include<stdio.h>
#include<string.h>

int main()
{
        char str1[100] = "I love"; // 目标空间必须足够大
        char str2[] = "FishC.com!";

        strcat_s(str1, sizeof(str1), " "); // 中途不能改变它的大小
        strcat_s(str1, sizeof(str1), str2);// 中途不能改变它的大小

        printf("%s\n", str1);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-16 21:36:48 | 显示全部楼层    本楼为最佳答案   
不同编译器严格性不一样。这很正常。
#include<stdio.h>
#include<string.h>

int main()
{
        char str1[100] = "I love"; // 目标空间必须足够大
        char str2[] = "FishC.com!";

        strcat_s(str1, sizeof(str1), " "); // 中途不能改变它的大小
        strcat_s(str1, sizeof(str1), str2);// 中途不能改变它的大小

        printf("%s\n", str1);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-16 21:57:18 | 显示全部楼层
str1开辟的空间大小是该字符串说占用的空间,也就是7个字节
,strcat()追加字符串时,没有空间了,就报错了

// 在VS中代码第一行加入
#pragma warning(disable:4996)
//就可以使用strcat、scanf
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-1-16 22:03:49 | 显示全部楼层
1.png 这里是str1在未指定数值长度时在内存开辟的空间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-17 17:48:25 | 显示全部楼层
3楼的兄弟已经说的很清楚了
char str1[] = "I love";    //这句执行完 str1的长度就固定了,占用7个字节
strcat_s(str1,sizeof(str1)+1, " "); //这句是把长度为8个字节的字符数组赋值给只有7个字节空间的字符数组,越界!
strcat_s(str1,sizeof(str1)+sizeof(str2), str2);  // 这一句同理,也是越界的

只要str1足够长,就不会越界,可以直接给str1足够的长度, 定义时  char str1[1024];
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-1-17 18:08:41 | 显示全部楼层
两手空空儿 发表于 2023-1-17 17:48
3楼的兄弟已经说的很清楚了

所以我把strcat_s函数的第二个参数写成 sizeof(str1)+1 ,试图加一个字节把空格放进去。但是这个空间的大小不能中途改变,结果依旧越界。(应该是这样吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-18 09:24:12 | 显示全部楼层
狡诈恶徒 发表于 2023-1-17 18:08
所以我把strcat_s函数的第二个参数写成 sizeof(str1)+1 ,试图加一个字节把空格放进去。但是这个空间的大 ...


是的,数组声明以后长度就固定了,不能改变,存储内容发生变化的数组,要预留足够的空间防止越界。
要想使用可变长度的空间,就用动态申请内存的方式
malloc , calloc 这样的函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 17:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表