首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 標準庫字串函數實戰:strlen/strcpy/strcmp/strchr/strstr/strcat 綜合範例

     編輯:關於C

常用函數速查表

函數原型功能回傳
strlensize_t strlen(const char *s)計算字串長度 (不含 \0)長度
strcpychar *strcpy(char *dst, const char *src)複製字串至 dst (需保證空間足夠)dst
strcmpint strcmp(const char *s1, const char *s2)按 ASCII 碼逐字元比較<0 / 0 / >0
strchrchar *strchr(const char *s, int c)尋找字元 c 首次出現位址位址 / NULL
strstrchar *strstr(const char *hay, const char *needle)尋找子字串首次出現位址位址 / NULL
strcatchar *strcat(char *dst, const char *src)將 src 接到 dst 尾部 (需空間足夠)dst

綜合範例:姓名格式轉換 "jie wang" → "wang, jie"


#include <stdio.h>
#include <string.h>

void reverseName(const char *name, char *out) {
    char *space = strchr(name, ' ');      // 定位空格
    if (!space) { strcpy(out, name); return; }
    
    *space = '\0';                        // 暫時截斷
    strcpy(out, space + 1);               // 複製姓氏
    strcat(out, ", ");                   // 加逗號空格
    strcat(out, name);                    // 接名字
    *space = ' ';                         // 還原 (若原字串可修改)
}

int main() {
    char name[] = "jie wang";   // 可修改陣列
    char newName[30];
    reverseName(name, newName);
    printf("%s\n", newName);  // 輸出: wang, jie
    return 0;
}

關鍵細節提醒

  1. 緩衝區安全:strcpy/strcat 不檢查目的緩衝區大小,實務建議改用 strncpy/strncat 或 snprintf。
  2. 字串字面常數不可修改:char *p = "abc"; p[0]='x'; 會導致段錯誤。需用陣列 char p[] = "abc";。
  3. strcmp 回傳值語意:s1 < s2 → 負值,== → 0,> → 正值,切勿寫成 if (strcmp(a,b)) 判斷相等(應寫 == 0)。
  4. strchr/strstr 回傳指標:指向原字串內部,可直接列印子字串或計算偏移 ptr - base 得索引。
  5. 多位元組字元集 (UTF-8) 下:上述函數按**位元組**操作,非字元;中文處理請用 wchar.h 或 ICU 庫。

進階替代方案

需求推薦函數/庫
安全複製/拼接strlcpy/strlcat (BSD)、snprintf
不區分大小寫比較strcasecmp / _stricmp
Token 切割strtok_r (可重入)、strsep
Unicode 正規化/比較ICU (icu4c)、wcs* 寬字元函數族

結語

熟練掌握 string.h 六大核心函數,配合指標算術與緩衝區管理,即可處理 90% 的 C 語言字串任務。記住:**安全第一、邊界檢查、編碼意識**,是從「能跑」到「健壯」的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved