Kalan's Blog

本部落主要是關於前端、軟體開發以及我在日本的生活,也會寫一些對時事的觀察和雜感

目前主題 亮色

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

作者

Kalan 頭像照片,在淡水拍攝,淺藍背景

愷開 | Kalan

愷開。台灣人,在 2019 年到日本工作,目前定居在福岡。除了熟悉前端之外對 IoT、App 開發、後端、電子電路領域都有涉略。最近開始玩電吉他。 歡迎 Email 諮詢或合作,聊聊音樂也可以,希望能透過這個部落格和更多的人交流。