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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:25:22