C语言文件解析代码异常:data2无输出问题求助
问题排查与修复
核心问题:sscanf格式字符串错误
原代码中sscanf的格式字符串"%c = %[^\n]s\n"存在致命错误:%[^\n]是独立的格式说明符,用于读取直到换行符为止的所有字符,后面额外加的s会导致sscanf匹配失败——它会尝试在%[^\n]读取的内容后匹配一个s字符,但输入中没有该字符,因此整个匹配逻辑失效,data2始终未被赋值,打印自然无输出。
修复后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *filePtr = fopen("input.txt", "r"); if (!filePtr) { perror("Failed to open file"); return 1; } char data1; // 必须检查内存分配是否成功,避免空指针操作 char* data2 = malloc(128 * sizeof(char)); if (!data2) { perror("Failed to allocate memory"); fclose(filePtr); return 1; } char line[128]; while(fgets(line, sizeof(line), filePtr) != NULL) { // 去掉多余的s,在%c前加空格跳过行首空白(比如注释行的前置空格) // fgets会读取换行符到line中,%[^\n]会自动截止到换行符,无需额外匹配\n if (sscanf(line, " %c = %[^\n]", &data1, data2) == 2) { // 仅在成功匹配两个字段时处理,避免无效行污染数据 printf("data1: %c, data2: %s\n", data1, data2); } } free(data2); fclose(filePtr); return 0; }
额外优化说明
- 资源有效性检查:原代码未检查
malloc和fopen的返回值,若操作失败会触发未定义行为,修复后补充了错误处理逻辑。 - 处理空白字符:在
%c前添加空格,可以自动跳过行首的空白(比如注释行的前置空格),避免错误将空格读取到data1中。 - 匹配结果校验:通过
sscanf的返回值判断是否成功匹配2个字段,避免无效行(如纯注释行)覆盖之前读取的有效数据。 - 资源清理:使用完动态分配的
data2后调用free,关闭文件指针,避免内存泄漏与资源浪费。
测试输出
针对给定的输入文件:
f = g - 42; //This is a new line
修复后的代码会输出:
data1: f, data2: g - 42;
内容的提问来源于stack exchange,提问作者William Lin
相关产品推荐
相关产品推荐

