目次
1. C語言中的字串操作基礎是什麼?
C語言的字串是以字元陣列管理,並且必須以 \0
(null 字元)作為結尾。如果缺少這個結尾,可能會導致存取超出記憶體範圍,進而產生錯誤或當機。
- 對策:務必確認字串已加上 null 結尾,或使用安全的函式。
2. 字串的基本操作
2.1 如何取得字串長度
strlen()
函式可取得字串長度,但如果陣列或指標未正確初始化,可能會造成記憶體洩漏或存取錯誤。
- 對策:避免存取未初始化的記憶體,務必進行正確的初始化。
2.2 字串複製
strcpy()
可能會導致緩衝區溢位,因此建議使用 strncpy()
或 strcpy_s()
。
- 對策:一定要確認目標緩衝區大小,使用
strncpy()
防止溢位。
2.3 字串串接
strcat()
若串接目標緩衝區不足,可能會發生緩衝區溢位。
- 對策:務必確認緩衝區大小,避免超出範圍的串接操作。

3. 安全的字串操作
3.1 緩衝區溢位的危險性
緩衝區溢位會帶來嚴重的資安風險或造成程式當機。
- 對策:處理外部輸入時,請使用
fgets()
或snprintf()
等安全函式,預防溢位。
3.2 動態記憶體管理
使用 malloc()
配置記憶體時可能失敗,若未處理會導致程式當機。
- 對策:一定要檢查
malloc()
的返回值,並正確釋放記憶體。
4. 實用的字串操作
4.1 字串搜尋與分割
strchr()
和 strstr()
僅支援 ASCII 字串。若需搜尋 UTF-8 或多位元字元,需另行處理。
- 對策:處理多位元字元時,可利用
mbstowcs()
轉換為寬字元後再操作。
5. 常見錯誤與處理方式
5.1 忘記加 null 結尾
若沒有 null 結尾,字串操作可能無法正常運作,還可能存取到記憶體外部。
- 對策:用
strncpy()
時,請務必自行補上 null 結尾。
5.2 錯誤處理
動態記憶體分配失敗時會回傳 NULL,若直接存取會導致程式當機。
- 對策:一定要檢查
malloc()
的返回值,確認不是 NULL 後再操作。

6. 編碼問題
處理非 ASCII 字元時,必須注意編碼差異。
- 對策:多位元字元建議使用
mbstowcs()
、wcstombs()
轉換為寬字元處理。
7. 除錯與資安強化
7.1 Valgrind
Valgrind
是檢查記憶體洩漏與未初始化記憶體存取的強大工具。
- 對策:執行程式時可用
valgrind
檢查是否有記憶體洩漏或 bug。
7.2 AddressSanitizer
AddressSanitizer
(ASan)可偵測緩衝區溢位及釋放後的存取錯誤。
- 對策:編譯時加入
-fsanitize=address
選項,可即時偵測記憶體相關錯誤。
8. 與其他語言的比較
C語言需要程式設計師手動管理記憶體,而像 Python、Java 這些高階語言則自動有垃圾回收(GC)機制。

9. 總結
本篇介紹了 C 語言字串操作的重要重點與資安對策。
- 最重要的重點:
- 為避免緩衝區溢位,務必確認緩衝區大小並使用安全函式。
- 注意編碼問題,正確處理日文等多位元字元。
- 善用除錯工具,及早發現程式中的記憶體管理問題。