這是一個源自《The C Programming Language》(第二版)的經典練習程序,旨在統計標準輸入中的字符數、單詞數以及行數。程序展示了狀態機在文本處理中的典型應用。
程序定義了兩個狀態常量:IN(在單詞內)和 OUT(在單詞外)。變量 STATE 用於追蹤當前掃描位置是否處於單詞中。主循環透過 getchar() 逐字符讀取輸入,直到遇到字符 'q' 為止。
'\n' 時遞增。OUT 轉為 IN 時(即遇到非空白字符且之前處於單詞外部),單詞數加一。空白字符包括空格 ' '、換行符 '\n' 和製表符 '\t',遇到這些字符會將狀態重置為 OUT。
#include <stdio.h>
#define IN 1 /* 在單詞中 */
#define OUT 0 /* 不在單詞中 */
/* The C programming language[second edition] 練習小程序
功能:統計輸入的字符數、單詞數和行數。 */
int main() {
int c; // 存儲輸入的字符
int STATE = OUT; // 狀態初始為不在單詞中
int nc = 0; // 記錄字符數
int nl = 0; // 記錄行數
int nw = 0; // 記錄單詞數
while ((c = getchar()) != 'q') { // 輸入 'q' 則退出
nc++;
if (c == '\n') nl++;
if (c == ' ' || c == '\n' || c == '\t')
STATE = OUT;
else if (STATE == OUT) {
STATE = IN;
nw++;
}
}
printf("%d %d %d\n", nl, nw, nc);
return 0;
}
原代碼中 printf 格式字符串 "%d % d %d\n" 存在多餘空格,已在上方修正。此外,若需支援 EOF(如 Ctrl+D/Ctrl+Z)作為結束條件,可將循環條件改為 (c = getchar()) != EOF,這樣更符合通用輸入習慣。