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

字符串格式说明符可读取部分变量,后续变量无法正常赋值

问题分析与解决

问题根源

你的代码里有两个关键错误导致后续变量读取失败:

  1. 浮点数格式说明符误用:sscanf的格式字符串里,%.2f是输出专用格式(用于printf类函数控制小数位数),输入浮点数时不能带精度限制,直接用%f即可。
  2. status变量类型不匹配:status被定义为单个char,但%[^)]是读取字符串的格式符,会将"CONCLUÍDA"整个字符串写入,导致缓冲区溢出,同时破坏栈上的其他变量(比如nota1、nota2的内存)。

修正后的代码

#include <stdio.h>

int main() {
    // 把%.2f改为%f,去掉浮点数精度限制
    const char* MATERIA_FORMAT_IN = "(DPAAIN.%03d;%[^;];%f;%f;%[^)])";

    int id = 0;
    char nome[50] = { '\0' };
    // 将status改为足够大的字符数组,容纳状态字符串
    char status[20] = { '\0' };
    float nota1 = 0.0, nota2 = 0.0;

    int result = sscanf("(DPAAIN.001;Algoritmos e Técnicas de Programação I;10.00;10.00;CONCLUÍDA)", 
                       MATERIA_FORMAT_IN, &id, nome, &nota1, &nota2, status);
    
    // 验证读取结果
    printf("id: %d\nnome: %s\nnota1: %.2f\nnota2: %.2f\nstatus: %s\n", 
           id, nome, nota1, nota2, status);
        
    return 0;
}

修正说明

  • 移除浮点数格式中的.2:sscanf读取浮点数时,会自动解析数字部分,精度限制对输入无意义,反而会导致格式匹配失败。
  • 调整status的类型:单个char无法存储多字符的状态字符串,改为数组后可以安全接收%[^)]读取的内容,避免内存溢出。
  • 新增result变量接收sscanf的返回值:可以用来验证成功读取的变量数量(预期返回5),方便调试。

运行修正后的代码,就能得到预期的结果:

id: 1
nome: Algoritmos e Técnicas de Programação I
nota1: 10.00
nota2: 10.00
status: CONCLUÍDA

内容的提问来源于stack exchange,提问作者Alexandre Filho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 14:50:06