半熟前端

軟體工程師 / 台灣人 / 在前端的路上一邊探索其他領域的可能性

本部落格使用 Gatsby 製作

本部落格有使用 Google Analytic 及 Cookie

程式語言

C 語言當中的字串處理

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

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

c
#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 的話:

diff
#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 操作之前需要預先檢查一下結合後的字串長度是否會導致溢出,如果會的話就要重新分配記憶體大小。

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

Buy me a coffee