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

C 語言經典題解:HTML 特殊字元轉義 (< > 空格 轉 < >  )

     編輯:關於C

題目:Judge Online — HTML 實體編碼

讀取輸入行,將特殊字元轉換為 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
aca<b>c
tab\theretab   here

延伸:完整 HTML 實體編碼函式

// 更完整的實體編碼 (可擴充)
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;
        }
    }
}

關鍵:& 必須**最優先**轉義,否則 < 會變成 &lt; (雙重編碼)。

常見錯誤

  • 用 gets (已移除 C11,緩衝區溢出風險)
  • 未移除 fgets 的換行符 → 輸出多空行
  • 轉義順序錯誤:& 未優先處理
  • 緩衝區過小導致長行截斷

總結

HTML 實體編碼 = 逐行讀取 (fgets) + 逐字元 switch 轉換 + 優先處理 &。這是 Web 開發、模板引擎、Markdown 渲染器的核心基礎功能。掌握字元級流式處理模式,可擴充至任意字元映射轉換 (URL 編碼、Base64、自定義协議)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved