C语言字符、单词、行数统计程序的单词计数逻辑问题咨询
嘿,我来帮你搞定这个统计程序的问题~
首先得说,你原程序的单词计数逻辑确实有问题,咱们先拆解下问题出在哪:
- 你现在是遇到空格或换行就给单词数+1,这会导致连续的空格/换行被当成多个单词分隔符,比如输入
hello world(三个空格),你的程序会把这三个空格都算成单词分隔,最后单词数会错误地变成3,而正确的单词数应该是2。 - 另外你完全没按照需求里的单词定义来判断:需求说单词是字母+撇号的连续序列,你的程序根本没检查字符是否属于这两类,比如输入
123hello,你的程序会因为没遇到空格/换行,完全不会统计这个单词,这就漏计数了。
那正确的实现思路应该是跟踪“是否处于单词中”的状态,而不是单纯看分隔符。咱们一步步来写正确的代码:
#include <stdio.h> #include <ctype.h> int main() { int ch; unsigned long int charcount = 0; unsigned long int wordcount = 0; unsigned long int linecount = 0; // 用标记变量记录当前是否在单词里,0表示不在,1表示在 int in_word = 0; while ((ch = getchar()) != EOF) { // 统计所有输入字符(包括空格、换行,若需统计非空白字符,可把这行移到单词判断分支里) charcount++; // 判断当前字符是否是单词组成部分:字母(a-z/A-Z)或撇号 if (isalpha(ch) || ch == '\'') { // 如果之前不在单词里,说明进入了新单词,计数+1 if (!in_word) { wordcount++; in_word = 1; } } else { // 当前字符不属于单词,标记为不在单词状态 in_word = 0; } // 统计行数:每遇到一个换行符就加1,符合需求定义 if (ch == '\n') { linecount++; } } printf("%lu %lu %lu\n", charcount, wordcount, linecount); return 0; }
咱们再解释下关键部分:
- 字符计数:这里统计所有输入字符(包括空格、换行),如果需求是只统计非空白字符,把
charcount++移到if (isalpha(ch) || ch == '\'')的分支里即可。 - 单词计数:只有当从“非单词状态”切换到“单词状态”时,才给单词数+1,这样不管有多少个连续的分隔符(空格、换行、数字、符号),都只会触发一次状态切换,不会重复计数,同时严格符合单词的定义。
- 行数计数:完全按照需求,每遇到一个
\n就加1,最后一行没有换行的话,不会被统计成行,符合要求。
举几个测试用例验证下:
- 输入:
don't stop\nhello→ 字符数15,单词数3,行数1 - 输入:
hello world(三个空格,无换行)→ 字符数11,单词数2,行数0 - 输入:
123test'abc!xyz→ 单词数2,字符数13,行数0
这样就完全符合你的需求啦~
内容的提问来源于stack exchange,提问作者nadia




