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

C 語言常用字串處理函數速查表:sprintf、strlen、strcpy、strcat、strcmp、strstr、strchr、strncpy、strlwr/strupr

     編輯:關於C語言

C 標準庫 `` 提供核心字串操作函數。本文整理 9 大類最常用函數的原型、行為、回傳值與實用範例,作為開發時的快速參考。

1. 格式化輸出到字串:sprintf / snprintf (C99 安全版)

int sprintf(char *buf, const char *fmt, ...);
int snprintf(char *buf, size_t n, const char *fmt, ...); // 防止緩衝區溢出

char result[100];
sprintf(result, "File_%03d.log", 42);     // "File_042.log"
snprintf(result, sizeof(result), "%s_%d", "user", 100);

2. 字串長度:strlen

size_t strlen(const char *s); // 不包含結尾 \0
// 注意:若 s 非合法字串 (缺 \0) 會導致未定義行為

3. 字串複製:strcpy / strncpy / strcpy_s (C11 Annex K)

函數行為風險
strcpy(dst, src)複製含 \0 直到結束dst 空間不足導致溢出
strncpy(dst, src, n)複製前 n 字元;src < n 時補 \0;src ≥ n 時 **不自動加 \0**需手動 `dst[n-1]=0` 確保結尾
strcpy_s(dst, dstsz, src)安全版,檢查空間,失敗返回錯誤碼需編譯器支援 C11 Annex K (MSVC 支援)

4. 字串連接:strcat / strncat

char path[260] = "C:\\Data\\";
strcat(path, "file.txt");      // "C:\\Data\\file.txt"
strncat(path, ".bak", 4);      // 追加前 4 字元

5. 字串比較:strcmp / strncmp / stricmp (大小寫不敏感) / strnicmp

int cmp = strcmp("abc", "abd"); // < 0 (abc < abd)
int cmp = stricmp("ABC", "abc"); // 0 (忽略大小寫相等)

回傳值:< 0 (s10 (s1>s2)。

6. 尋找子字串:strstr

char *p = strstr("hello world", "world"); // 返回指向 "world" 的指標
if (p) printf("Found at offset %ld\n", p - "hello world");

7. 尋找單一字元:strchr / strrchr (反向)

char *p = strchr("hello", 'l');  // 指向第一個 'l'
char *p = strrchr("hello", 'l'); // 指向最後一個 'l'

8. 字串分解:strtok / strtok_s (執行緒安全)

char str[] = "a,b,c;d";
char *token = strtok(str, ",;"); // 第一次傳字串
while (token) {
    printf("%s\n", token);
    token = strtok(NULL, ",;");  // 後續傳 NULL
}
// 注意:strtok 會修改原字串 (插入 \0),且非執行緒安全

9. 大小寫轉換:strlwr / strupr (Microsoft 擴展,非標準)

char s[] = "Hello";
strlwr(s); // "hello"
strupr(s); // "HELLO"
// 跨平台建議自行實作或用 towlower/towupper 逐字元轉換

常見坑點提醒

  • 緩衝區大小: 所有寫入操作 (`strcpy`, `strcat`, `sprintf`) 必須確保目的緩衝區足夠大,建議改用 `snprintf`, `strncpy_s`, `strcat_s`。
  • strncpy **不保證以 \0 結尾**,使用後務必 `dst[n-1] = '\0'`。
  • strtok 破壞原字串且不可重入,多執行緒環境必須用 `strtok_s` / `strtok_r`。
  • 字串字面值 (`"hello"`) 存放於唯讀區,**絕不可** 作為 `strcpy`/`strcat`/`strtok` 的目的端。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved