讀取輸入行,將特殊字元轉換為 HTML 實體:
< → <> → >空格 → (或保留空格,題目需確認)製表符 → (3 個 )逐行處理至 EOF。
#include#include int main() { char line[1024]; // 逐行讀取 (保留空白) while (fgets(line, sizeof(line), stdin)) { // 移除 fgets 保留的換行符 size_t len = strlen(line); if (len > 0 && line[len-1] == '\n') line[--len] = '\0'; for (size_t i = 0; i < len; i++) { switch (line[i]) { case '<': printf("<"); break; case '>': printf(">"); break; case ' ': printf(" "); break; // 或 putchar(' ') 視題目 case '\t': printf(" "); break; default: putchar(line[i]); break; } } putchar('\n'); } return 0; }
| 細節 | 處理 |
|---|---|
| 逐行讀取 | fgets 保留空白/製表符,scanf/gets 不適合 |
| 移除換行 | fgets 含 \n,需手動去除避免重複換行 |
| 字元逐一處理 | switch 或 if-else 鏈,效能相當 |
| 空格處理 | 題目原碼將空格轉 ,但 HTML 中通常保留空格。以題目要求為準。 |
| 緩衝區大小 | 1024 足夠一般行長,極長行需動態分配或分塊讀取 |
| 輸入行 | 輸出行 |
|---|---|
hello world | <html>hello world |
ac | a<b>c |
tab\there | tab here |
// 更完整的實體編碼 (可擴充)
void html_escape(const char *input, FILE *out) {
for (const char *p = input; *p; p++) {
switch (*p) {
case '&': fputs("&", out); break; // & 必須優先轉義!
case '<': fputs("<", out); break;
case '>': fputs(">", out); break;
case '"': fputs(""", out); break;
case '\'': fputs("'", out); break; // HTML5
case ' ': fputs(" ", out); break; // 視需求
default: fputc(*p, out); break;
}
}
}
關鍵:& 必須**最優先**轉義,否則 < 會變成 < (雙重編碼)。
gets (已移除 C11,緩衝區溢出風險)fgets 的換行符 → 輸出多空行& 未優先處理HTML 實體編碼 = 逐行讀取 (fgets) + 逐字元 switch 轉換 + 優先處理 &。這是 Web 開發、模板引擎、Markdown 渲染器的核心基礎功能。掌握字元級流式處理模式,可擴充至任意字元映射轉換 (URL 編碼、Base64、自定義协議)。