字符串處理是C語言程式設計的高頻需求。本文系統梳理 <string.h> 核心函數,並通過實戰案例演示正確用法與常見陷阱。
| 函數 | 原型 | 功能 | 返回值 | 注意事項 |
|---|---|---|---|---|
| strlen | size_t strlen(const char *s) | 計算字符串長度 | 長度(不含\0) | 遇\0停止,必須保證字符串正確終止 |
| strcpy | char *strcpy(char *dest, const char *src) | 複製字符串 | dest | 需確保dest空間≥src長度+1,否則溢出 |
| strcat | char *strcat(char *dest, const char *src) | 拼接字符串 | dest | dest必須有足夠空間,src接在dest\0後 |
| strcmp | int strcmp(const char *s1, const char *s2) | 比較字符串 | <0, =0, >0 | 按ASCII碼逐字符比較,區分大小寫 |
| strchr | char *strchr(const char *s, int c) | 查找字符首次出現 | 指針/NULL | 包含\0在搜索範圍內 |
| strstr | char *strstr(const char *haystack, const char *needle) | 查找子串首次出現 | 指針/NULL | 子串為空返回haystack |
#include <stdio.h>
#include <string.h>
int main() {
char s1[] = "I am a student";
char s2[20] = "teacher";
char s3[] = "student";
char s4[20], *p;
int result;
// 1. 長度
printf("len(s1)=%zu, len(s2)=%zu\n", strlen(s1), strlen(s2)); // 14, 7
// 2. 複製
strcpy(s4, s2);
printf("s4=%s\n", s4); // teacher
// 3. 比較
result = strcmp(s2, s3); // 't' > 's' -> 正數
printf("cmp=%d\n", result);
// 4. 字符定位
p = strchr(s1, 's');
printf("strchr=%s\n", p); // student
// 5. 子串查找
p = strstr(s1, s3);
printf("strstr=%s\n", p); // student
// 6. 拼接
strcat(s2, s3);
printf("s2=%s\n", s2); // teacherstudent
return 0;
}
將 "jie wang" 轉換為 "wang,jie" 格式:
void ReverseName(char *name, char *newName) {
char *p = strchr(name, ' '); // 定位空格
*p = '\0'; // 截斷為 "jie"
printf("first=%s\n", name); // jie
printf("rest=%s\n", p); // (空字符)
strcpy(newName, p + 1); // 複製 "wang" -> newName
strcat(newName, ","); // 拼接 "," -> "wang,"
strcat(newName, name); // 拼接 "jie" -> "wang,jie"
*p = ' '; // 恢復原字符串
printf("original=%s\n", name); // jie wang
}
int main() {
char name[] = "jie wang", newName[30];
ReverseName(name, newName);
printf("result=%s\n", newName); // wang,jie
return 0;
}
strcpy/strcat 不檢查目標空間,必須確保目標緩衝區足夠大strncpy、strncat、snprintf 等帶長度限制的版本// 安全複製
strncpy(dest, src, sizeof(dest)-1);
dest[sizeof(dest)-1] = '\0';
// 安全拼接
strncat(dest, src, sizeof(dest) - strlen(dest) - 1);
// 格式化輸出(最推薦)
snprintf(dest, sizeof(dest), "%s%s", str1, str2);
char *a = "hello";
char *b = "hello";
// 錯誤:比較地址
if (a == b) ... // 可能為真(字面量合併),也可能為假
// 正確:比較內容
if (strcmp(a, b) == 0) ... // 內容相等
strlen/strcpy/strcat/strcmp/strchr/strstr 六大核心函數snprintf 替代 strcpy/strcat 組合\0 的關鍵作用:所有字符串函數都依賴它作為邊界字符串處理看似簡單,實則暗藏記憶體安全隱患。養成防御性編程習慣,是C程序員的基本功。