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

C 語言實作:移除字串中多餘空白字元(修正版)

     編輯:關於C語言

問題

讀取標準輸入,將連續空白字元(空格、Tab、換行)壓縮為單一空格,保留單詞間單一間隔,輸出至標準輸出。

核心邏輯:有限狀態機

  • 狀態 IN_WORD:正在讀取單詞字元,直接輸出。
  • 狀態 IN_SPACE:讀取到空白字元,輸出單一空格並進入此狀態,後續連續空白直接丟棄直到下一非空白字元。

完整代碼(含大塊緩衝讀取優化)

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

#define BUFSZ 4096

int main() {
    char buf[BUFSZ];
    size_t n;
    int in_space = 0;  // 0=在單詞中, 1=在空白序列中

    while ((n = fread(buf, 1, BUFSZ, stdin)) > 0) {
        for (size_t i = 0; i < n; ++i) {
            unsigned char c = buf[i];
            if (isspace(c)) {
                if (!in_space) { putchar(' '); in_space = 1; }
            } else {
                putchar(c);
                in_space = 0;
            }
        }
    }
    if (ferror(stdin)) perror("fread");
    return 0;
}

關鍵點

  • fread 大塊讀取,避免逐字元 getchar 系統調用開銷。
  • isspace 涵蓋空格、Tab、換行、垂直製表、換頁、回車。
  • 狀態變數 in_space 確保連續空白僅輸出一個空格。
  • 輸出直接寫入 stdout,配合管道/重導向高效流式處理。

測試範例

$ echo -e "hello   world\t\t\n\nC" | ./squeeze
hello world C
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved