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

C语言读取文本文件存入二维数组仅首个单词正常问题求助

问题诊断&修复方案

核心问题列表

  • 类型不匹配错误:main函数中申请的text是一维char*指针,而readFile函数接收的是二维数组char [ROWS][COLS],二者内存寻址逻辑完全不同,导致首个单词之后的内容写入的内存地址完全错位,只有第一行存储正常
  • 单词无字符串结束符:每个单词写入完成后没有追加'\0',后续将数组元素当做字符串读取时会出现乱码
  • 分隔符重复计数bug:遇到连续空格、换行等分隔符时会重复累加numWords、递增行号i,会生成大量空行的无效数组元素,计数也不准
  • 变量类型错误:fgetc返回值为int类型,变量ch定义为char会导致EOF判断逻辑失效(无符号char场景下-1会被转为255,永远不等于EOF)
  • 边界逻辑缺失:文件打开失败后没有终止逻辑,空文件场景下计数初始值为1不符合预期

修复方案

  1. main函数中直接定义二维数组,保证参数类型匹配
  2. 每次遇到分隔符确认单词结束后,追加'\0'作为字符串结束标记
  3. 新增分隔符连续判断逻辑,只有当前一个字符不是分隔符时,才触发单词计数和行号递增
  4. 将ch修改为int类型,修复EOF判断问题
  5. 新增文件打开失败后的退出逻辑,调整计数初始值适配空文件、末尾无分隔符等边界场景

完整修复后代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define SIZE 100
#define ROWS 5000
#define COLS 50

int readFile(char text[ROWS][COLS]);
void menu(char* choice);

int main() {
    int numWords = 0, i;
    // 直接定义二维数组,类型和readFile参数匹配
    char text[ROWS][COLS];
    char choice;
    numWords = readFile(text);
    // 测试输出所有单词
    for (i = 0; i < numWords; i++) {
        printf("第%d个单词:%s\n", i+1, text[i]);
    }
    return 0;
}

int readFile(char text[][COLS]) {
    FILE *keyFile;
    char fileInput[SIZE], inBuf[SIZE];
    // ch改为int类型适配fgetc返回值
    int ch;
    int i = 0, j = 0;
    int numWords = 0;
    // 标记前一个字符是否是分隔符,避免连续分隔符重复计数
    int lastIsSep = 1;

    printf("Enter the file to use as a key\n");
    fgets(inBuf, SIZE, stdin);
    sscanf(inBuf, "%s", fileInput);

    keyFile = fopen(fileInput, "r");
    if (keyFile == NULL) {
        printf("Error! File Not Found\n");
        // 打开失败返回0
        return 0;
    }

    while ((ch = fgetc(keyFile)) != EOF) {
        if (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\0') {
            // 只有前一个字符不是分隔符,才说明是单词结束
            if (!lastIsSep) {
                // 追加字符串结束符
                text[i][j] = '\0';
                numWords++;
                i++;
                j = 0;
                lastIsSep = 1;
            }
        } else {
            text[i][j] = tolower((unsigned char)ch);
            j++;
            // 防止单词长度超过列数溢出
            if (j >= COLS - 1) {
                j = COLS - 1;
            }
            lastIsSep = 0;
        }
    }
    // 处理最后一个单词(文件末尾没有分隔符的情况)
    if (!lastIsSep) {
        text[i][j] = '\0';
        numWords++;
    }

    fclose(keyFile);
    printf("Number of words in this file is %d\n", numWords);
    return numWords;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:09:00