题目

读文本文件,统计单词数(以空白分隔)

思路

本题统计文本文件中的单词数(空白分隔)。

维护状态 inWord:从「不在单词内」进入非空白字符时 words++ 并置在单词内;遇到空白则置不在单词内;文件结束前别漏掉最后一个词。

解题分析

fscanf 读 %s 会以空白分隔单词,连续空白算一次分隔。标点粘在单词上算同一 token,若要严格标点切分需自行 parse。

函数简要说明

在已打开的文本文件上按空白分隔读单词时,常见两种写法:

  • fscanf(fp, "%s", word):跳过前导空白,读入一个不含空白的 token;重复调用直到返回非 1,统计次数即为单词数。标点会粘在单词上,与 C100 题意一致。
  • fgets 读整行再用循环/字符串函数切分也可以,本题 fscanf 更短。
  • fopen / fclose:同第 91 题,打开失败要单独处理。

完整程序

#include <stdio.h>

int main(void)
{
    FILE *fp = fopen("input.txt", "r");
    if (!fp) {
        printf("open failed\n");
        return 1;
    }
    char word[256];
    int cnt = 0;
    while (fscanf(fp, "%255s", word) == 1) {
        cnt++;
    }
    fclose(fp);
    printf("%d\n", cnt);
    return 0;
}