统计一行文本的单词个数
一、题目到底在考什么
给定一行字符,要求:
单词 = 连续不含空格的字符串
单词之间可以有多个空格
行首、行尾也可能有空格
输出:单词总个数
关键点:
不能简单看到空格就 + 1,因为连续多个空格只算分隔一次。
二、核心解题思路(万能模板)
- 用一个 “状态标记”
定义一个变量,比如:
c
int in_word = 0;
in_word = 0:当前在空格里
in_word = 1:当前在单词里
-
遍历每个字符
逐个读字符,直到读到换行 \n 为止(代表一行结束)。 -
只有一种情况要 +1
从 “空格” → 第一次进入 “单词” 时,单词数 +1
也就是:
c
if (当前字符不是空格 && in_word == 0) {
count++;
in_word = 1;
}
遇到空格时:
c
if (当前字符是空格) {
in_word = 0;
}
三、为什么这么写
这样能自动处理所有情况:
行首多个空格
中间多个空格
行尾空格
空行
只有一个单词
四、标准完整代码(背下来)
c
include <stdio.h>
int main() {
char c;
int count = 0; // 单词数
int in_word = 0;
// 读取一行所有字符,直到换行
while ((c = getchar()) != '\n') {
if (c != ' ') {
// 从空格进入单词 → 新单词
if (in_word == 0) {
count++;
in_word = 1;
}
} else {
// 进入空格区
in_word = 0;
}
}
printf("%d\n", count);
return 0;
}
五、这类题最容易犯的错
1.用 scanf ("% s") 读一行
%s 遇到空格就停,读不完一整行。
→ 必须用 getchar() 或 gets/fgets。
2. 看到空格就 count++
连续空格会导致 count 暴增,结果错误。
3. 忘记处理行首空格
行首空格不能算单词开始。
4.字符比较写成 " "
字符必须用单引号 ' ',双引号是字符串。
六、同类题通用解法
只要是统计单词、统计句子、统计字母段,都用这个思路:
状态标记法:
记录当前在 “里面” 还是 “外面”
只有从外进入内时才计数
浙公网安备 33010602011771号