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

C语言实现TXT文件单词排序功能代码运行异常排查

代码错误列表
  • 参数处理部分错误:
    1. 未校验argc参数个数,用户输入参数不足时直接访问argv[1]、argv[2]会触发内存越界崩溃
    2. 将argv字符串转为float的操作完全冗余,无实际作用
    3. 存储文件名的dict数组长度仅为strlen(argv[2]),未预留字符串结束符\0的空间,strcpy操作会触发缓冲区溢出
    4. argv[0]存储的是程序运行时的完整路径/程序名,默认不等于固定字符串wordcount,该判断条件几乎永远无法触发
  • 读取逻辑部分错误:
    1. fgetc返回值为int类型,用char存储out变量会导致EOF判断失效
    2. 内层循环首次执行时j=0,访问line[i][j-1]属于数组负下标访问,是非法内存操作
    3. atoi(" ")、atoi("\n")这类写法完全多余,直接使用字符常量' '、'\n'、'#'即可,且判断逻辑顺序颠倒,先读取字符再判断前一位字符的逻辑完全不符合需求
    4. 未实现整行判断逻辑,也没有处理单行多个单词的拆分存储
  • 其他冗余与疏漏:
    1. fopen传入的("%s", dict)是多余的逗号表达式,直接传入dict即可
    2. 存储的字符串未主动添加结束符,后续操作会把无效字符也识别为字符串内容
修正后实现代码
#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:06:02