在 C 語言當中,可以透過 strlen
來取得字串長度。然而每次 strlen
的呼叫都是 ,對於頻繁存取字串操作的應用來說,當字串長度很大時容易造成效能瓶頸,尤其在大流量的應用中尤其如此。一個解決方法是透過另外一個變數保存字串長度,每次有對字串的操作時就改變此變數,這樣一來存取字串長度時只要存取此變數即可,時間複雜度為 。
另外一個要注意的是 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 操作之前需要預先檢查一下結合後的字串長度是否會導致溢出,如果會的話就要重新分配記憶體大小。