字符串格式说明符可读取部分变量,后续变量无法正常赋值
问题分析与解决
问题根源
你的代码里有两个关键错误导致后续变量读取失败:
- 浮点数格式说明符误用:
sscanf的格式字符串里,%.2f是输出专用格式(用于printf类函数控制小数位数),输入浮点数时不能带精度限制,直接用%f即可。 - 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, ¬a1, ¬a2, 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
相关产品推荐
相关产品推荐

