用C语言实现单词统计,核心是通过遍历字符序列,识别单词的开始和结束边界,从而准确计数。单词通常由连续的字母或数字组成,被空格、标点符号、换行符等非单词字符分隔,我们需要设计合理的逻辑来捕捉这些边界变化。

核心实现思路
单词统计的核心逻辑可以拆解为以下几个步骤:
- 定义两个状态变量,一个表示当前是否处于单词内部,另一个用于记录单词总数
- 逐个遍历输入的每一个字符,判断字符是否属于单词组成字符(字母或数字)
- 当字符从非单词字符变为单词字符时,说明遇到了一个新单词,计数加一
- 遍历结束后,得到的计数就是单词的总数量
基础版本:统计字符串中的单词
首先实现统计一个固定字符串中单词数量的功能,这里我们先处理只包含字母和空格的简单场景,后续再扩展适配更多分隔符。
#include <stdio.h>
#include <ctype.h>
// 判断字符是否为单词组成字符,这里先只考虑字母
int is_word_char(char c) {
return isalpha(c);
}
// 统计字符串中的单词数量
int count_words(const char *str) {
int word_count = 0;
int in_word = 0; // 0表示不在单词内,1表示在单词内
const char *p = str;
while (*p != ' ') {
if (is_word_char(*p)) {
// 当前是单词字符,且之前不在单词内,说明遇到新单词
if (!in_word) {
word_count++;
in_word = 1;
}
} else {
// 当前是非单词字符,标记不在单词内
in_word = 0;
}
p++;
}
return word_count;
}
int main() {
char test_str[] = "Hello World This is a test string";
int result = count_words(test_str);
printf("字符串中的单词数量为:%dn", result);
return 0;
}
上面的代码中,isalpha是C标准库中的函数,用来判断字符是否为字母,需要包含ctype.h头文件。运行这段代码会输出字符串中的单词数量为6,符合预期结果。
扩展版本:适配更多分隔符和文件统计
实际场景中,单词可能被逗号、句号、换行符等分隔,同时我们可能需要统计文件中的单词数量,下面扩展代码适配这些需求。
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
// 判断字符是否为单词组成字符,字母或数字都算
bool is_word_char(char c) {
return isalnum(c);
}
// 统计文件中的单词数量
int count_file_words(const char *filename) {
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
printf("无法打开文件:%sn", filename);
return -1;
}
int word_count = 0;
bool in_word = false;
int ch;
while ((ch = fgetc(fp)) != EOF) {
if (is_word_char(ch)) {
if (!in_word) {
word_count++;
in_word = true;
}
} else {
in_word = false;
}
}
fclose(fp);
return word_count;
}
int main() {
// 统计当前目录下test.txt文件的单词数量,若文件不存在会提示错误
int result = count_file_words("test.txt");
if (result != -1) {
printf("文件中的单词数量为:%dn", result);
}
return 0;
}
这个扩展版本中,我们用isalnum函数判断字符是否为字母或数字,适配了更多单词组成场景。同时用fgetc逐个读取文件字符,支持统计任意文本文件中的单词数量。如果文件中有换行符、标点符号,都会被正确识别为非单词字符,不会影响统计结果。
注意事项
- 如果单词中包含下划线、连字符等特殊字符,需要修改
is_word_char函数的判断逻辑,把这些字符也纳入单词组成范围 - 处理文件时要注意文件路径的正确性,以及文件打开失败时的错误处理,避免程序异常崩溃
- 如果需要统计每个单词的出现次数,可以在现有逻辑基础上增加哈希表或者数组来记录单词和对应的频次