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

C 語言字符串操作大全:標準庫函數、記憶體操作、C++ string 完整指南

     編輯:關於C

一、C 標準庫 <string.h> 核心函數

1. 複製與拼接

函數原型說明
strcpychar *strcpy(char *dest, const char *src)複製含結束符,需保證 dest 足夠大
strncpychar *strncpy(char *dest, const char *src, size_t n)複製前 n 字符,不足補 \0,超長不加 \0
strcatchar *strcat(char *dest, const char *src)拼接到 dest 末尾,覆蓋原 \0
strncatchar *strncat(char *dest, const char *src, size_t n)拼接前 n 字符

2. 長度與比較

函數原型說明
strlensize_t strlen(const char *s)不含 \0 的長度
strcmpint strcmp(const char *s1, const char *s2)字典序比較,返回 <0, =0, >0
strncmpint strncmp(const char *s1, const char *s2, size_t n)比較前 n 字符
strcasecmpint strcasecmp(const char *s1, const char *s2)忽略大小寫比較 (POSIX)

3. 查找

函數原型說明
strchrchar *strchr(const char *s, int c)正向查找字符 c 首次位置
strrchrchar *strrchr(const char *s, int c)反向查找字符 c 最後位置
strstrchar *strstr(const char *haystack, const char *needle)查找子串首次位置
strpbrkchar *strpbrk(const char *s, const char *accept)查找 accept 中任一字符首次位置
strspnsize_t strspn(const char *s, const char *accept)s 開頭連續屬於 accept 的長度
strcspnsize_t strcspn(const char *s, const char *reject)s 開頭連續不屬於 reject 的長度

4. 字符串轉數值

函數原型說明
atoiint atoi(const char *s)轉 int,錯誤返回 0
atollong atol(const char *s)轉 long
atofdouble atof(const char *s)轉 double
strtollong strtol(const char *s, char **endptr, int base)健壯轉換,base=0 自動識別 0x/0 前綴
strtoddouble strtod(const char *s, char **endptr)健壯轉 double

5. 字符分類 <ctype.h>


isalpha(c)  isupper(c)  islower(c)  isdigit(c)  isxdigit(c)
isspace(c)  iscntrl(c)  ispunct(c)  isalnum(c)  isprint(c)  isgraph(c)

參數為 int(實為 unsigned char 或 EOF),返回非 0 表示真。

二、記憶體操作 <string.h>

函數原型說明
memsetvoid *memset(void *s, int c, size_t n)前 n 字節置為 c
memcpyvoid *memcpy(void *dest, const void *src, size_t n)複製 n 字節,**不處理重疊**
memmovevoid *memmove(void *dest, const void *src, size_t n)複製 n 字節,**安全處理重疊**
memcmpint memcmp(const void *s1, const void *s2, size_t n)比較前 n 字節
memchrvoid *memchr(const void *s, int c, size_t n)查找前 n 字節中首個 c

三、常見扩展函數(非標準,常見於 GCC/MSVC)

函數說明
strdupmalloc 並複製字符串,需 free
strrev原地反轉字符串
strupr / strlwr原地大/小寫轉換
strset / strnset設置字符串所有/前 n 字符為指定值
strtok分割字符串,**會修改原串**,非線程安全

四、C++ std::string 完整指南

1. 核心特點

  • 非序列容器,無 front()/back()
  • 支援 operator[]、at() 訪問
  • size_type 為 size_t,npos = -1 表示無效位置

2. 構造方式(13 種)


// 1. 默認
string s1;
// 2. 複製
string s2(s1);
// 3. 部分複製
string s3(s1, pos, len);
// 4. C 字符串
string s4("hello");
// 5. C 字符串 + 長度
string s5("hello", 3); // "hel"
// 6. 重複字符
string s6(5, 'a'); // "aaaaa"
// 7. 迭代器範圍
string s7(s1.begin(), s1.end());
// 8. 移動構造 (C++11)
string s8(std::move(s1));

3. 容量管理


size()      // 有效長度
capacity()  // 緩衝區容量
reserve(n)  // 預留至少 n 字節
resize(n)   // 改變長度,可指定填充字符
shrink_to_fit() // 釋放多餘容量 (C++11)

4. 修改操作


// 追加
s += "tail";  s.append("tail");
s.push_back('c');

// 插入
s.insert(pos, "mid");
s.insert(pos, 3, 'x'); // 插入 3 個 'x'
s.insert(pos, it_begin, it_end);

// 替換
s.replace(pos, len, "new");
s.replace(it_begin, it_end, "new");

// 刪除
s.erase(pos, len);
s.erase(it);
s.erase(it_begin, it_end);
s.clear();

5. 查找與子串


// 查找(返回位置或 npos)
s.find("sub", pos);
s.rfind("sub", pos);           // 反向
s.find_first_of("chars", pos); // 任一字符
s.find_last_of("chars", pos);
s.find_first_not_of("chars", pos);
s.find_last_not_of("chars", pos);

// 子串
string sub = s.substr(pos, len);

// C 風格指針
const char* cstr = s.c_str(); // 含 \0
const char* data = s.data();  // C++11 保證含 \0

6. 比較


s.compare(s2);           // -1/0/1
s.compare(pos, len, s2);
s.compare(pos, len, s2, pos2, len2);
s.compare(pos, len, "cstr");
s.compare(pos, len, "cstr", len2);

7. 迭代器


s.begin(), s.end(), s.rbegin(), s.rend()
s.cbegin(), s.cend() // C++11 常量迭代器

8. 輸入輸出


getline(cin, s);        // 讀整行
cin >> s;               // 讀單詞
cout << s;

五、最佳實踐與避坑指南

  1. 緩衝區溢出:用 strncpy/snprintf/strncat 替代無界版本
  2. 重疊複製:memmove 安全,memcpy 未定義行為
  3. 字符串字面量不可修改:char *p = "hello"; p[0] = 'H'; // UB,用 char p[] = "hello";
  4. strtok 破壞原串且非線程安全:C++ 用 stringstream 或 std::getline + 分割
  5. atoi 族無錯誤檢測:優先用 strtol/strtod 檢查 endptr
  6. C++ string 避免頻繁擴容:大量拼接前 reserve()
  7. 嵌入 \0 的字符串:C 風格以 \0 結尾,std::string 可包含 \0,用 data()+size() 安全處理
  8. 字節序無關:字符串操作不涉及網絡字節序

六、速查表:常用操作對照

操作C 風格C++ string
複製strcpy/strncpys2 = s1 / s2.assign(s1)
拼接strcat/strncats1 += s2 / s1.append(s2)
長度strlens.size()
比較strcmp/strncmps1.compare(s2) / s1 == s2
查找字符strchr/strrchrs.find(c) / s.rfind(c)
查找子串strstrs.find(sub)
轉整數strtolstoi / stol / stoll
轉浮點strtodstof / stod / stold
分割strtokstringstream + getline
大小寫轉換strupr/strlwr (非標準)transform + ::toupper/tolower

總結

  • C 風格:<string.h> + <ctype.h>,掌握核心 10 個函數覆蓋 90% 場景
  • 記憶體操作:memmove > memcpy(安全性),memset 只能填單字節值
  • C++ std::string:功能豐富、異常安全、支援嵌入 \0,現代 C++ 首選
  • 避坑關鍵:緩衝區大小、重疊複製、字面量只讀、錯誤檢測、線程安全

熟練這些工具,字符串處理不再是痛點。

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