logo
  • 現在做什麼
  • 關於我

Kalan

文章分類

  • 前端
  • 開發筆記
  • 雜談
  • 年度回顧

快速連結

  • 現在做什麼
  • 關於我
  • 聯絡我
  • 職涯思考🔗

關注我

在福岡生活的開發者,分享軟體開發與日本生活的點點滴滴。

© 2025 Kalan Made with ❤️. All rights reserved.

C 語言當中的字串處理

由愷開愷開撰寫2022年3月20日 9:00
首頁/開發筆記
💡

如果想問問題或單純回饋的話可以填寫表單唷

English日文

目錄

    在 C 語言當中,可以透過 strlen 來取得字串長度。然而每次 strlen 的呼叫都是 O(n)O(n)O(n),對於頻繁存取字串操作的應用來說,當字串長度很大時容易造成效能瓶頸,尤其在大流量的應用中尤其如此。一個解決方法是透過另外一個變數保存字串長度,每次有對字串的操作時就改變此變數,這樣一來存取字串長度時只要存取此變數即可,時間複雜度為 O(1)O(1)O(1)。

    另外一個要注意的是 C 語言並不會對你的 buffer 長度有任何預設,所以在做 concat 之類的操作時就要很小心,例如透過 strcat 來撰寫的話:

    #include <stdio.h>
    #include <string.h>
    
    int main(void) {
      char buf1[20] = "abc";
      char buf2[] = "def";
      strcat(buf1, buf2);
      printf("%s\n", buf1);
      return 0;
    }

    這段程式碼會將 buf2 的內容跟 buf1 結合並連接在 buf1 之後。然而如果我們將 buf1 的大小減少至 5 的話:

    #include <stdio.h>
    #include <string.h>
    
    int main(void) {
    + char buf1[4] = "abc";
      char buf2[] = "def";
      strcat(buf1, buf2);
    
      printf("%s\n", buf1);
      return 0;
    }

    執行後會發現程式碼有錯誤。這是因為當 buf1 與 buf2 結合之後大小超過 4 而導致緩衝溢出。解決方法是在執行 concat 操作之前需要預先檢查一下結合後的字串長度是否會導致溢出,如果會的話就要重新分配記憶體大小。

    ← 探討 Remix 的表單與資料讀取機制用 Next.js 重寫整個部落格 →

    如果覺得這篇文章對你有幫助的話,可以考慮下面的連結請我喝一杯 ☕ 可以讓我平凡的一天變得閃閃發光 ✨

    ☕Buy me a coffee