核心字符串函數實戰(示例一)
#include <stdio.h> #include <string.h>
void display(const char* name, const char* str) {
printf("%s%s\n", name, str);
}
int main() {
char ch1[40] = "hello world";
char ch2[40] = "I love you";
display("ch1= ", ch1);
display("ch2= ", ch2);
// 1. 長度
printf("len= %zu\n", strlen(ch1));
// 2. 比較
printf("strcmp= %d\n", strcmp(ch1, ch2));
// 3. 字符查找 → 返回子串指針
display("strchr 'w': ", strchr(ch1, 'w'));
// 4. 子串查找
display("strstr 'world': ", strstr(ch1, "world"));
// 5. 字符集查找(首個匹配字符)
display("strpbrk 'l': ", strpbrk(ch1, "l"));
// 6. 字符集前綴長度
printf("strspn 'he': %zu\n", strspn(ch1, "he"));
// 7. 追加
strcat(ch1, ch2);
display("strcat: ", ch1);
// 8. 複製
strcpy(ch1, ch2);
display("strcpy: ", ch1);
return 0;
}
關鍵函數行為速查
| 函數 | 返回值 | 注意事項 |
| strlen | size_t 長度 | 不含結束符 \0 |
| strcmp | <0 / 0 / >0 | 字典序比較 |
| strchr | char* 指針 | 未找到返回 NULL |
| strstr | char* 指針 | 子串首次出現位置 |
| strcat | dest 指針 | 需保證 dest 空間足夠 |
| strcpy | dest 指針 | 含 \0 複製,有溢出風險 |
字符串↔數值轉換(示例二)
#include <stdlib.h>
char num[] = "4.56";
int i = atoi(num); // 4
float f = atof(num); // 4.56
double d = atof(num); // 4.56
// 更安全的現代替代:strtol/strtod 族函數
字符分類函數(<ctype.h>)
| 函數 | 判斷條件 | 示例 |
| isalpha | 字母 A-Z/a-z | isalpha('a')=真 |
| isupper / islower | 大寫 / 小寫字母 | isupper('A')=真 |
| isdigit | 十進制數字 0-9 | isdigit('5')=真 |
| isxdigit | 十六進制字符 0-9/A-F/a-f | isxdigit('F')=真 |
| isspace | 空白字符(空格/換行/製表) | isspace(' ')=真 |
| iscntrl | 控制字符 | iscntrl('\r')=真 |
| ispunct | 標點符號 | ispunct(',')=真 |
| isalnum | 字母或數字 | isalnum('4')=真 |
| isprint | 可打印字符(含空格) | isprint('d')=真 |
| isgraph | 可見字符(非空格) | 等價 isalnum|ispunct |
安全編程提醒
- 避免
strcpy/strcat/sprintf,改用 strncpy/strncat/snprintf 或 C++ std::string
- 字符分類函數參數需轉
unsigned char 避免負值未定義行為
- 區域設置(locale)影響字符分類結果,跨平台注意
掌握以上核心函數與分類邏輯,覆蓋 90%+ 字符串處理場景。