You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C语言sscanf解析字符串时出现字段截断问题求助

解决sscanf解析字符串时name首字节被覆盖的问题

问题出在**short类型变量strength使用了错误的格式化符**:

  • strength是short(通常占2字节),但你用了对应int(通常占4字节)的%d格式化符。sscanf会尝试往&strength地址写入4字节数据,超出short的内存范围,直接覆盖了相邻的name数组首字节,导致name变成\0haoliu,看起来只有haoliu。

修复方案

  1. 给short类型变量使用对应格式化符%hd,确保只写入2字节数据,避免内存越界。
  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,提问作者守静笃

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:00:56