讀取標準輸入,將連續空白字元(空格、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