讀取輸入行,將連續空格序列按以下規則替換:
\t,餘數保留空格例如:"a b c"(3+4 空格)→ "a\tb\t c"(1 tab + 1 tab + 1 space)。
#include <stdio.h>
#include <stdlib.h>
#define MAXIMUM 1000
// 讀取一行(含換行),返回長度;EOF 或空行返回 0
int getline(char *line) {
int i, c;
for (i = 0; (c = getchar()) != EOF && c != '\n'; i++)
line[i] = c;
if (i == 0 && c == EOF) return 0; // 檔案結束且無內容
if (c == '\n') line[i++] = '\n'; // 保留換行
line[i] = '\0';
return i;
}
int main() {
char line[MAXIMUM];
char newline[MAXIMUM];
int len;
while ((len = getline(line)) > 0) {
int j = 0, k = 0;
// 處理每一字元
while (j < len) {
if (line[j] != ' ') {
newline[k++] = line[j++];
} else {
// 統計連續空格數
int ecount = 0;
int i = j;
while (i < len && line[i] == ' ') {
ecount++; i++;
}
j = i; // 跳過這組空格
// 依規則轉換
int tab_count = ecount / 3;
int space_count = ecount % 3;
for (int n = 0; n < tab_count; n++) newline[k++] = '\t';
for (int n = 0; n < space_count; n++) newline[k++] = ' ';
}
}
newline[k] = '\0'; // 關鍵:字串結束符
printf("%s", newline); // 已含換行,不再加 \n
}
return 0;
}
| 問題 | 修正 |
|---|---|
| 外層 `for` 迴圈內修改 `j` | 改用 `while (j < len)` 手動控制 `j` 推進 |
| `ecount` 未歸零 | 在每組空格處理前 `int ecount = 0;` |
| `if (c = '\n')` | 改為 `if (c == '\n')` |
| `newline` 缺 `\0` | 迴圈結束後 `newline[k] = '\0';` |
| 使用 `gets()` | 自寫 `getline()` 基於 `getchar()`,安全可控 |
輸入:
a b c d
(a+3空格+b+4空格+c+5空格+d)
輸出:
a→b→c→ d
(視覺化:→ 代表 tab,空格顯示為空格)
實際輸出字串:'a','\t','b','\t','c','\t',' ','d','\n'