C语言读取文本文件存入二维数组仅首个单词正常问题求助
问题诊断&修复方案
核心问题列表
- 类型不匹配错误:main函数中申请的
text是一维char*指针,而readFile函数接收的是二维数组char [ROWS][COLS],二者内存寻址逻辑完全不同,导致首个单词之后的内容写入的内存地址完全错位,只有第一行存储正常 - 单词无字符串结束符:每个单词写入完成后没有追加
'\0',后续将数组元素当做字符串读取时会出现乱码 - 分隔符重复计数bug:遇到连续空格、换行等分隔符时会重复累加
numWords、递增行号i,会生成大量空行的无效数组元素,计数也不准 - 变量类型错误:
fgetc返回值为int类型,变量ch定义为char会导致EOF判断逻辑失效(无符号char场景下-1会被转为255,永远不等于EOF) - 边界逻辑缺失:文件打开失败后没有终止逻辑,空文件场景下计数初始值为1不符合预期
修复方案
- main函数中直接定义二维数组,保证参数类型匹配
- 每次遇到分隔符确认单词结束后,追加
'\0'作为字符串结束标记 - 新增分隔符连续判断逻辑,只有当前一个字符不是分隔符时,才触发单词计数和行号递增
- 将
ch修改为int类型,修复EOF判断问题 - 新增文件打开失败后的退出逻辑,调整计数初始值适配空文件、末尾无分隔符等边界场景
完整修复后代码
#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
相关产品推荐
相关产品推荐

