C语言实现TXT文件单词排序功能代码运行异常排查
代码错误列表
- 参数处理部分错误:
- 未校验
argc参数个数,用户输入参数不足时直接访问argv[1]、argv[2]会触发内存越界崩溃 - 将
argv字符串转为float的操作完全冗余,无实际作用 - 存储文件名的
dict数组长度仅为strlen(argv[2]),未预留字符串结束符\0的空间,strcpy操作会触发缓冲区溢出 argv[0]存储的是程序运行时的完整路径/程序名,默认不等于固定字符串wordcount,该判断条件几乎永远无法触发
- 未校验
- 读取逻辑部分错误:
fgetc返回值为int类型,用char存储out变量会导致EOF判断失效- 内层循环首次执行时
j=0,访问line[i][j-1]属于数组负下标访问,是非法内存操作 atoi(" ")、atoi("\n")这类写法完全多余,直接使用字符常量' '、'\n'、'#'即可,且判断逻辑顺序颠倒,先读取字符再判断前一位字符的逻辑完全不符合需求- 未实现整行判断逻辑,也没有处理单行多个单词的拆分存储
- 其他冗余与疏漏:
fopen传入的("%s", dict)是多余的逗号表达式,直接传入dict即可- 存储的字符串未主动添加结束符,后续操作会把无效字符也识别为字符串内容
修正后实现代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define TML 50 #define TMF 255 int main(int argc, char * argv[]){ // 先校验参数个数 if(argc < 3) { printf("Usage: %s dictfile <filename>\n", argv[0]); return 1; } char dict[strlen(argv[2]) + 1]; // 预留结束符空间 strcpy(dict, argv[2]); FILE *df; char line[TMF][TML] = {0}; // 存储有效单词 int word_cnt = 0; char buf[TML] = {0}; // 行缓存 df = fopen(dict, "r"); if(df == NULL) { printf("Error in opening file\n"); return 1; } // 逐行读取 while(fgets(buf, TML, df) != NULL) { // 跳过空行 if(buf[0] == '\n' || buf[0] == '\r') continue; // 跳过#开头的行 if(buf[0] == '#') continue; // 拆分当前行的单词 char *p = buf; while(*p != '\0') { // 跳过空格、换行等空白符 while(isspace(*p)) p++; if(*p == '\0') break; // 读取单个单词 int j = 0; while(*p != '\0' && !isspace(*p) && j < TML -1) { line[word_cnt][j] = *p; j++; p++; } line[word_cnt][j] = '\0'; word_cnt++; if(word_cnt >= TMF) break; } } fclose(df); // 输出所有有效单词 printf("Valid words count: %d\n", word_cnt); for(int i = 0; i < word_cnt; i++) { printf("%s\n", line[i]); } // 排序逻辑可在此处添加,使用qsort配合strcmp即可实现 return 0; }
编译运行时直接传入参数dictfile 你的txt文件名即可读取所有有效单词,如需添加排序功能,调用标准库qsort函数配合字符串比较函数strcmp即可快速实现排序需求。
内容的提问来源于stack exchange,提问作者dhiya-eddine Nadour
相关产品推荐
相关产品推荐

