首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

統計單詞個數:C語言經典算法實現與多種解法對比

     編輯:關於C語言

題目:統計一行文本的單詞個數(ZJU PAT 循環-06)

輸入一行文本,統計其中單詞數量。單詞定義為由字母組成的連續序列,非字母字符作為分隔符。

標準解法(狀態機思想)

#include <stdio.h>

int main() {
    char input, prev = ' ';
    int count = 0;
    while ((input = getchar()) != '\n') {
        if (input != ' ' && prev == ' ')  // 發現單詞開始
            count++;
        prev = input;
    }
    printf("%d\n", count);
    return 0;
}

核心邏輯解析

  • 用 prev 記錄前一字符,初始為空格
  • 當前字符非空格且前一字符為空格 → 單詞開始 → 計數器+1
  • 這是典型的有限狀態自動機:狀態「在單詞外」→ 讀到字母 → 進入「在單詞內」並計數
  • 時間 O(n),空間 O(1),單次掃描完成

擴展:統計文件中各單詞出現次數

#include <stdio.h>
#include <ctype.h>

void main() {
    char ch;
    int wordCount = 0, inWord = 0;
    FILE *fp1 = fopen("test.txt", "r");
    FILE *fp2 = fopen("result.txt", "w");
    if (!fp1 || !fp2) { puts("cannot open file!"); return; }
    while ((ch = fgetc(fp1)) != EOF) {
        if (isalpha(ch) && !inWord) { inWord = 1; }
        else if (!isalpha(ch) && inWord) { wordCount++; inWord = 0; }
    }
    fprintf(fp2, "%d", wordCount);
    fclose(fp1); fclose(fp2);
}

C# 版本實現

using System;

namespace WordCount {
    class Program {
        static int CountWords(string str) {
            int count = 0;
            for (int i = 0; i < str.Length; i++) {
                char c = str[i];
                if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')))
                    count++;
            }
            return count;
        }
        static void Main() {
            string s = "My name is cuihao,what about you?";
            Console.WriteLine(CountWords(s));
            Console.Read();
        }
    }
}

關鍵點總結

場景關鍵函數/方法注意事項
標準輸入單行getchar() + 狀態變量處理連續空格、制表符等
文件統計fgetc() + isalpha()需檢查 EOF,文件指針管理
字符串統計遍歷字符判斷字母C# 用 Char.IsLetter() 更簡潔

常見陷阱

  1. 多種分隔符:空格、制表符、標點符號、換行符皆為分隔符
  2. 行首行尾空格:初始狀態設為「非單詞內」可自然處理
  3. 空行輸入:應輸出 0 而非報錯
  4. 非 ASCII 字符:isalpha() 行為取決於 locale,跨平台需注意

題目鏈接

ZJU PAT Basic Programming - 循環-06 統計單詞個數

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved