使用C语言sscanf解析字符串时出现字段截断问题求助
解决sscanf解析字符串时name首字节被覆盖的问题
问题出在**short类型变量strength使用了错误的格式化符**:
strength是short(通常占2字节),但你用了对应int(通常占4字节)的%d格式化符。sscanf会尝试往&strength地址写入4字节数据,超出short的内存范围,直接覆盖了相邻的name数组首字节,导致name变成\0haoliu,看起来只有haoliu。
修复方案
- 给
short类型变量使用对应格式化符%hd,确保只写入2字节数据,避免内存越界。 - 为
%s指定最大读取长度,防止字符串过长导致缓冲区溢出(比如INSERT[10]对应%9s,留1字节给字符串终止符\0;name[15]对应%14s)。
修正后的代码:
#include<iostream> #include<string.h> using namespace std; int main(){ char INSERT[10]; int id; char name[15]; short strength; string instr = "INSERT 3 zhaoliu 13"; sscanf(instr.c_str(), "%9s %d %14s %hd", INSERT, &id, name, &strength); }
验证说明
- 使用
%hd后,sscanf会正确读取short类型数据,不会越界覆盖name的内存空间,此时name会完整存储zhaoliu。 - 指定
%s的长度能避免后续如果输入字符串过长导致的缓冲区溢出问题,提升代码安全性。
内容的提问来源于stack exchange,提问作者守静笃
相关产品推荐
相关产品推荐

