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

C语言程序输出不可读字符的原因排查与修复方案

问题原因与修复方案

问题原因

  1. 命令行参数索引错误:char **jumbles对应命令行参数数组,其中jumbles[0]是程序自身路径(./unscramble),你执行命令时传入的dictionary.txt是jumbles[1],jumbles.txt是jumbles[2]。你直接取*jumbles等价于jumbles[0],导致程序打开了自身的二进制可执行文件,读取并输出二进制内容,因此出现乱码。
  2. 缺少错误检查:没有判断fopen是否成功,若文件打开失败(如路径错误、权限不足),jumbles_file会成为NULL,后续fgets操作空指针会触发未定义行为。

修复后的代码

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

int main(int argc, char **argv) {
    // 校验参数数量是否符合要求
    if (argc < 3) {
        fprintf(stderr, "用法: %s <dictionary.txt> <jumbles.txt>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    // 获取目标文件路径(jumbles.txt)
    const char *jumbles_path = argv[2];
    FILE *jumbles_file = fopen(jumbles_path, "r");
    
    // 检查文件是否成功打开
    if (!jumbles_file) {
        perror("无法打开文件");
        exit(EXIT_FAILURE);
    }

    char jumbles_words[52];
    while (fgets(jumbles_words, sizeof(jumbles_words), jumbles_file)) {
        printf("%s", jumbles_words);
    }

    fclose(jumbles_file); // 关闭文件,避免资源泄漏
    return 0;
}

修复关键点说明

  • 修正参数索引:使用argv[2]获取你需要的jumbles.txt路径,匹配命令行传入的参数顺序。
  • 增加参数校验:通过argc判断用户是否传入足够参数,同时给出明确的用法提示。
  • 补充文件打开检查:用perror输出具体错误原因(如文件不存在、权限不够),便于问题排查。
  • 添加文件关闭操作:规范资源管理,避免文件描述符泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:01:17