C语言程序输出不可读字符的原因排查与修复方案
问题原因与修复方案
问题原因
- 命令行参数索引错误:
char **jumbles对应命令行参数数组,其中jumbles[0]是程序自身路径(./unscramble),你执行命令时传入的dictionary.txt是jumbles[1],jumbles.txt是jumbles[2]。你直接取*jumbles等价于jumbles[0],导致程序打开了自身的二进制可执行文件,读取并输出二进制内容,因此出现乱码。 - 缺少错误检查:没有判断
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
相关产品推荐
相关产品推荐

