頭文件依賴
- IO 函數(printf、scanf、puts、gets):
<stdio.h>
- 字符串處理函數:
<string.h>
1. strlen - 字符串長度
size_t strlen(const char *str);
- 返回不含結束符 \0的字符數
- 從首字符開始計數,遇 \0 停止
示例
char str[] = "C language"; // strlen = 10
char str2[] = "C \0language"; // strlen = 2(遇內嵌 \0 停止)
2. strcat - 字符串拼接
char *strcat(char *dest, const char *src);
- 將
src 拼接到 dest 末尾,覆蓋 dest 的 \0
- dest 必須有足夠空間,否則緩衝區溢出
- 返回
dest 首地址
示例
char str1[40] = "My name is ";
char str2[20];
gets(str2); // 輸入 "xiao p"
strcat(str1, str2);
puts(str1); // 輸出 "My name is xiao p"
3. strcpy - 字符串復制
char *strcpy(char *dest, const char *src);
- 將
src(含 \0)完整復制到 dest
- dest 空間必須 ≥ src 長度+1
- 返回
dest 首地址
示例
char str1[15], str2[] = "C Language";
strcpy(str1, str2);
puts(str1); // 輸出 "C Language"
4. strcmp - 字符串比較
int strcmp(const char *s1, const char *s2);
- 按ASCII 碼值逐字符比較
- 相等返回 0;s1 > s2 返回 >0;s1 < s2 返回 <0
- 比較到首對不同字符或任一字符串結束
示例
char *a = "aBcDeF", *b = "AbCdEf", *c = "aacdef", *d = "aBcDeF";
printf("%d\n", strcmp(a, b)); // 1 ('B'(66) > 'b'(98)? 不,'a'(97) > 'A'(65) → 正數)
printf("%d\n", strcmp(a, c)); // -1
printf("%d\n", strcmp(a, d)); // 0
運行結果
strcmp(a, b) : 1
strcmp(a, c) : -1
strcmp(a, d) : 0
函數對比速查表
| 函數 | 功能 | 關鍵注意點 | 返回值 |
| strlen | 求長度 | 不含 \0 | 長度 (size_t) |
| strcat | 拼接 | dest 需足夠大,會覆蓋 \0 | dest 地址 |
| strcpy | 復制 | dest 需足夠大,含 \0 | dest 地址 |
| strcmp | 比較 | 按 ASCII,區分大小寫 | 0/正/負 |
安全增強版(C11 附錄 K / Microsoft 扩展)
strcat_s(dest, destsz, src); // 檢查緩衝區大小
strcpy_s(dest, destsz, src);
int strcmp_s(const char *s1, const char *s2); // 行為同 strcmp
常見錯誤與最佳實踐
- ❌
strcat(str1, str2) 而 str1 空間不足 → 緩衝區溢出
- ❌
strcmp(str1, str2) == 1 判斷大小 → 應用 > 0
- ✅ 使用
strncat/strncpy/strncmp 限制最大字符數
- ✅ 處理用戶輸入前先驗證長度
- ✅ 考慮使用
std::string (C++) 或安全庫函數