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

C 語言字串操作完整指南:常用函數與實作範例

     編輯:更多程式設計知識

一、核心字串操作函數

C 標準庫 <string.h> 提供了豐富的字串處理函數,以下分類整理最常用的操作:

1. 複製與串接

  • strcpy(dest, src):將 src 完整複製到 dest(含結束符 \0)。
  • strncpy(dest, src, n):複製 src 前 n 個字元;若 src 長度小於 n,剩餘處會補 \0。
  • strcat(dest, src):將 src 附加到 dest 末尾,自動覆蓋原結束符。
  • strncat(dest, src, n):附加 src 前 n 個字元,並自動加上結束符。

2. 長度與比較

  • strlen(str):回傳字串實際長度(不含 \0)。
  • strcmp(s1, s2):逐字元比較,回傳 <0、0、>0 分別代表 s1 小於、等於、大於 s2。
  • strcasecmp / stricmp:忽略大小寫比較(非標準但廣泛支援)。
  • strncmp(s1, s2, n):僅比較前 n 個字元。

3. 搜尋與掃描

  • strchr(str, c):尋找字元 c 首次出現位置。
  • strrchr(str, c):反向尋找字元 c 最後出現位置。
  • strstr(haystack, needle):尋找子字串 needle 首次出現位置。
  • strpbrk(str, set):在 str 中尋找 set 任一字元首次出現位置。
  • strspn(str, set):回傳 str 開頭連續屬於 set 的字元長度。
  • strcspn(str, set):回傳 str 開頭連續不屬於 set 的字元長度。

4. 記憶體區塊操作(適用於二進位資料)

  • memcpy(dest, src, n):複製 n 位元組,來源與目的不可重疊。
  • memmove(dest, src, n):可處理重疊區塊的複製。
  • memset(dest, c, n):將前 n 位元組設為字元 c。
  • memcmp(buf1, buf2, n):比較兩記憶體區塊前 n 位元組。
  • memchr(buf, c, n):在前 n 位元組中尋找字元 c。

二、字串轉數值函數

函數用途備註
strtod(str, &endptr)轉 doubleendptr 指向未轉換部分
strtol(str, &endptr, base)轉 longbase=0 可自動判斷 0x/0 開頭
atoi(str)轉 int簡易版,無錯誤檢查
atol(str)轉 long同上
atof(str)轉 double同上

三、字元分類函數(需 <ctype.h>)

所有函數接受 int(實為 unsigned char 或 EOF),回傳非零表真:

  • isalpha、isupper、islower、isdigit、isxdigit(16 進位)、isspace、iscntrl、ispunct、isalnum、isprint、isgraph(可列印且非空白)。

四、進階與平台擴充函數

部分編譯器(如 MSVC)另提供:

  • strrev:反轉字串;strupr/strlwr:大小寫轉換。
  • strset/strnset:填充字元。
  • strtok:依分隔字元集切割字串(會修改原字串,非執行緒安全)。
  • strdup:動態配置記憶體並複製字串,需自行 free。

五、實作範例精選

strcpy 示範

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

int main() {
    char str1[20] = "TsinghuaOK";
    char str2[]   = "Computer";
    printf("%s\n", strcpy(str1, str2));  // 輸出: Computer
    return 0;
}

注意:目的緩衝區必須足夠大,否則會發生緩衝區溢位。

strncpy 示範

char str1[20] = "Tsinghua ";
char str2[]   = "Computer";
printf("%s\n", strncpy(str1, str2, 3));  // 輸出: Comnghua

前 3 字元被覆蓋,剩餘保留原內容。

strcat / strncat 示範

char s1[30] = "Tsinghua ";
char s2[]   = "Computer";
strcat(s1, s2);      // "Tsinghua Computer"
strncat(s1, s2, 3);  // "Tsinghua ComputerCom"

strcmp 示範

char *a="aaa", *b="bbb", *c="ccc";
printf("%d %d\n", strcmp(b,a), strcmp(b,c));  // 正值 負值

strlen 示範

char buf[100];
scanf("%99s", buf);
printf("長度: %zu\n", strlen(buf));

六、C++ 風格字串(std::string)補充

現代 C++ 建議使用 std::string,具備 RAII、自動記憶體管理、豐富的成員函數(append, insert, erase, replace, find, substr, compare 等)與迭代器支援,避免手動管理緩衝區的風險。關鍵差異:

  • 非序列容器,無 front()/back(),用 operator[] 或 at() 存取。
  • 提供 c_str()、data() 取得 C 風格指標。
  • 支援 + 運算子串接,+=、push_back() 追加。
  • 緩衝區管理介面:size(), capacity(), reserve(), resize()。

七、常見陷阱與最佳實務

  1. 緩衝區溢位:永遠確保目的陣列大小 ≥ 來源長度 + 1(含 \0)。
  2. 未初始化指標:char *p; strcpy(p, "abc"); 會導致未定義行為,必須先配置記憶體。
  3. 字串常量不可修改:char *p = "hello"; p[0]='H'; 會崩潰,應用陣列 char p[]="hello";。
  4. strncpy 不保證以 \0 結尾:若來源長度 ≥ n,需手動補 dest[n] = '\0';。
  5. 多執行緒環境避免 strtok:改用 strtok_r 或 C++ std::stringstream。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved