You need to enable JavaScript to run this app. 如何从文本文件读取%s、%d等格式说明符供后续printf调用使用
优惠活动
大模型
产品
解决方案
定价
更多

如何从文本文件读取%s、%d等格式说明符供后续printf调用使用

实现方案

你需要的功能完全可以实现,原有代码无法运行主要是基础语法错误和fgets的读取特性导致的,调整后即可达到预期效果。

原有代码的问题点

  • 语法笔误:代码中的charn是拼写错误,C语言标准字符类型为char
  • 换行符残留:fgets读取文本行时会将行尾的换行符\n一同存入缓冲区,会导致最终输出多出不必要的换行
  • 缺少异常校验:没有判断文件打开、内存分配是否成功,也没有对读取到的格式串做合法性校验,存在安全风险

可运行的实现代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    FILE *f = fopen("/home/foo/bar", "r");
    if (f == NULL) {
        perror("文件打开失败");
        return 1;
    }

    char *s_buf = malloc(sizeof(char) * 256);
    if (s_buf == NULL) {
        perror("内存分配失败");
        fclose(f);
        return 1;
    }

    if (fgets(s_buf, 255, f) == NULL) {
        perror("文件读取失败");
        free(s_buf);
        fclose(f);
        return 1;
    }

    // 移除fgets读取到的末尾换行符
    size_t len = strlen(s_buf);
    if (len > 0 && s_buf[len - 1] == '\n') {
        s_buf[len - 1] = '\0';
    }

    // 可在此处添加格式串合法性校验,比如检查是否存在%n等危险格式符
    printf(s_buf, "bar");
    
    free(s_buf);
    fclose(f);
    return 0;
}

注意事项

  • 只可以读取可信来源的格式串,如果格式串来自外部不可信输入,攻击者可以构造包含%n、参数不匹配等恶意内容,触发格式化字符串漏洞,导致内存破坏、信息泄露甚至远程代码执行
  • 可以提前校验读取到的格式串的格式符类型、数量,和后续传入的参数做匹配,避免参数不匹配导致的未定义行为

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 07:15:02