sscanf造成的越界

本文深入探讨了在C语言中使用sscanf函数时遇到的一个常见问题:当目标变量类型与格式说明符不匹配时,可能导致的数据污染和错误读取。通过一个具体的代码示例,解释了如何正确地为不同大小的整数类型选择合适的格式说明符,以避免数据读取错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天写代码的时候发现了一个错误,比较奇怪。

代码如下:

#include "stdio.h"
#include "stdlib.h"
#include "stdint.h"


int main()
{
	uint8_t a = 0;
	uint16_t b = 0;
	uint32_t c = 100;
	uint8_t buff[] = "1 2";
	sscanf(buff,"%d %d",&a,&b);
	printf("a = %d,b = %d,c = %d\r\n",a,b,c);
	
	return 0;
	
}

看起来大头上没有什么问题。
但是执行起来

a = 1,b = 2,c = 0

其实这个编译的时候已经报了这个问题,但是我们常常会忽视他。
在这里插入图片描述
说到底,就是每次sscanf一个%d的时候都是按照4个字节来赋值的。但是我们给的是一个uint8_t,一个字节,这样旁边的几个位就被污染了,从而导致数据就变了。

那咋整呢这玩意

sscanf(buff,"%hhd %hd",&a,&b);

hh for uint8_t
h foruint16_t

a = 1,b = 2,c = 100

ok

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值