文件行/字符/单词统计程序计数错误问题求助
搞定你的单词统计程序计数问题
嘿,我帮你捋捋现有代码里的问题,这些应该就是导致不管选啥选项计数都不对的核心原因:
1. 命令行选项判断完全搞反了!
你写的if (strcmp("-c",argv[1]))逻辑彻底颠倒——strcmp函数返回0才代表两个字符串相等,现在的写法是当输入的选项不是-c的时候才进入分支,这肯定和你预期的功能完全相反啊!如果-c是用来统计字符的选项,正确的判断应该是:
if (strcmp("-c", argv[1]) == 0) { // 这里写字符统计的逻辑 }
2. 没检查文件是否能正常打开
你直接用fopen打开文件,但没判断返回的file是不是NULL。要是文件不存在、没有读取权限,程序直接操作空指针,轻则计数乱跳,重则直接崩溃。必须加上错误处理:
FILE *file = fopen(argv[i], "r"); if (file == NULL) { fprintf(stderr, "糟了,打不开文件: %s\n", argv[i]); continue; // 跳过这个有问题的文件,继续处理其他文件 }
3. 读取循环未完成(从你给出的代码片段看)
你的while((c = fgetc(file)...没写完,这里要注意两点:
- 循环条件得写完整:
while ((c = fgetc(file)) != EOF),不然程序根本不知道什么时候停止读取 - 如果是统计单词,得判断单词的边界——比如从空白字符切换到非空白字符时,才算一个新单词;如果是统计字符,就简单了,每读一个非EOF的字符就给计数+1
4. 文件用完后未关闭
处理完每个文件后,一定要用fclose(file)把文件关掉,不然会占用系统资源,也可能影响后续的计数准确性。
给你整个修正后的示例片段(以字符统计为例)
#include <stdio.h> #include <stdbool.h> #include <string.h> int main(int argc, char **argv){ int totalcount = 0; // 保存总计数 // 先检查参数是否合法 if (argc < 3) { fprintf(stderr, "用法: %s <选项> <文件1> [文件2...]\n", argv[0]); return 1; } for(int i = 2; i < argc; i++){ int count = 0; // 单个文件的计数 int c; // 临时存储读取的字符 FILE *file = fopen(argv[i], "r"); if (file == NULL) { fprintf(stderr, "错误:打不开文件 %s\n", argv[i]); continue; } if (strcmp("-c", argv[1]) == 0) { // 正确判断字符统计选项 while((c = fgetc(file)) != EOF) { count++; // 每个字符都计数+1 } printf("文件 %s 的字符数: %d\n", argv[i], count); totalcount += count; } // 要是加单词统计选项,就在这儿加判断,比如判断"-w" // 单词统计需要状态变量,比如bool in_word = false,跟踪是否处于单词中 fclose(file); // 用完记得关文件! } printf("总计数: %d\n", totalcount); return 0; }
要是你要做单词统计,记得加个状态变量,比如bool in_word = false:当读到非空白字符且in_word是false时,计数+1并把in_word设为true;读到空白字符时把in_word设为false,这样就能准确统计单词数啦。
内容的提问来源于stack exchange,提问作者Michael Hemmelgarn
相关产品推荐
相关产品推荐

