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

K&R 練習:C 語言統計字元、單字與行數

     編輯:關於C

程式規格

讀取標準輸入直到字元 'q',統計三項指標:

  • 字元數:含換行、空白、製表等所有字元。
  • 行數:\n 出現次數。
  • 單字數:以空白、換行、製表為分隔符的連續非空白序列。

狀態機邏輯

#define IN  1   // 在單字內
#define OUT 0   // 在單字外

int state = OUT;
int nc = 0, nl = 0, nw = 0;
int c;

while ((c = getchar()) != '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);

狀態轉移圖

         空白/\n/\t
    OUT ----------> OUT
     ^                |
     | 非空白         | 非空白
     |                v
    IN ----------> IN

完整程式碼

#include 

#define IN  1
#define OUT 0

int main() {
    int c, state = OUT;
    long nc = 0, nl = 0, nw = 0;  // 使用 long 避免溢位

    while ((c = getchar()) != 'q') {
        nc++;
        if (c == '\n') nl++;
        if (c == ' ' || c == '\n' || c == '\t')
            state = OUT;
        else if (state == OUT) {
            state = IN;
            nw++;
        }
    }
    printf("行數: %ld  單字數: %ld  字元數: %ld\n", nl, nw, nc);
    return 0;
}

測試範例

$ ./wc_demo
Hello world
This is a test
q
行數: 2  單字數: 6  字元數: 27

常見變體與擴充

  • 標準 wc 行為:遇 EOF 結束而非 'q',支援多檔案引數。
  • Unicode 支援:需處理多位元組字元,使用 wchar_t 與 getwc。
  • 單字定義擴充:納入標點符號、連字號等邊界條件。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved