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

C/C++ 常用字串處理函式完整速查與範例

     編輯:VC 教學

前言

<string.h>(C++ 為 <cstring>)提供了核心字串操作函式。本文整理 9 大類常用函式,附上參數說明、回傳值、邊界條件與完整可編譯範例,作為開發時的快速參考手冊。

函式分類速查表

類別函式功能關鍵備註
複製strcpy(s1, s2)複製整個字串s1 必須足夠大,無邊界檢查
strncpy(s1, s2, n)最多複製 n 字元若 s2 長度 < n,補 '\0' 至 n;若 ≥ n,不自動加結尾 '\0'
連接strcat(s1, s2)將 s2 附加至 s1 末尾s1 需有足夠空間,覆蓋原結尾 '\0'
strncat(s1, s2, n)最多附加 n 字元同樣需確保空間足夠
比較strcmp(s1, s2)字典序比較回傳 0(相等)、<0(s10(s1>s2)
strncmp(s1, s2, n)比較前 n 字元同上,僅比較前 n 字元
分割strtok(s1, s2)依 s2 字元集分割 s1破壞原字串、非執行緒安全、首次傳 s1 之後傳 NULL
長度strlen(s)回傳字元數(不含結尾 '\0')O(n) 掃描,頻繁呼叫建議快取
搜尋strchr(s, c) / strrchr(s, c)尋找字元 c 首次/最後出現位置回傳指標或 NULL
strstr(s1, s2)尋找子字串 s2 在 s1 中位置回傳指標或 NULL
轉換strlwr/strupr轉小寫/大寫(非標準,MSVC 為 _strlwr/_strupr)就地修改,C++ 建議用 std::transform + toupper/tolower

完整可編譯範例 (Visual C++ 6.0 / 現代編譯器均可)


// string_demo.cpp
#include 
#include   // C++ 標準頭檔
using namespace std;

int main()
{
    char str1[50] = "Happy birthday to ";
    char str2[] = "coffeehu";
    char temp1[100], temp2[6], *temp;
    char str[] = "This is a sentence with 7 tokens";

    // 1. strcpy / strncpy
    strcpy(temp1, str1);
    strncpy(temp2, str1, 5);
    temp2[5] = '\0';  // strncpy 不保證結尾 null,手動補上
    cout << "strcpy result: " << temp1 << "\n";
    cout << "strncpy result: " << temp2 << "\n";

    // 2. strcat / strncat
    cout << "strcat result: " << strcat(str1, str2) << "\n";
    // 注意:str1 已變更,strncat 會接在新尾端
    cout << "strncat result: " << strncat(str1, str2, 6) << "\n";

    // 3. strcmp / strncmp
    cout << "strcmp result: " << strcmp(temp2, "Happ") << "\n";   // temp2="Happy" > "Happ" → 正數
    cout << "strncmp result: " << strncmp(str1, "Happy", 5) << "\n"; // 比較前 5 字元

    // 4. strtok 分割
    cout << "strtok tokens:\n";
    temp = strtok(str, " ");
    while (temp != NULL)
    {
        cout << temp << '\n';
        temp = strtok(NULL, " ");
    }

    // 5. strlen
    cout << "strlen result: " << strlen(str2) << "\n";

    return 0;
}

執行輸出參考

strcpy result: Happy birthday to
strncpy result: Happy
strcat result: Happy birthday to coffeehu
strncat result: Happy birthday to coffeehu coffee
strcmp result: 1
strncmp result: 0
strtok tokens:
This
is
a
sentence
with
7
tokens
strlen result: 8

安全版本與現代 C++ 替代方案

C 函式風險C11 Annex K 安全版現代 C++ 建議
strcpy緩衝區溢位strcpy_sstd::string / std::strcpy (配合 size 檢查)
strcat緩衝區溢位strcat_sstd::string::operator+=
strncpy可能缺結尾 nullstrncpy_sstd::string::substr / assign
strtok破壞原串、非執行緒安全strtok_sstd::stringstream, std::regex, boost::split
sprintf格式化溢位sprintf_sstd::format (C++20), fmt::format, snprintf

常見錯誤與避坑指南

  • strncpy 不自動補 '\0':複製長度 ≥ n 時,目標字串無結尾 null,後續 strlen/printf 會越界。→ 總是手動 dest[n-1] = '\0' 或用 strncpy_s。
  • strtok 破壞原字串:將分隔符替換為 '\0'。→ 若需保留原串,先 strcpy 到暫存緩衝區再分割。
  • strtok 非執行緒安全:內部靜態狀態。→ 多執行緒環境用 strtok_s (C11) 或 strtok_r (POSIX)。
  • strcmp 回傳值誤判:以為非零即相等。→ 記住:0 才相等,非零表示大小關係。
  • 字串字面常數不可修改:char* s = "hello"; s[0] = 'H'; → 未定義行為。→ 用 char s[] = "hello"; 或 std::string。

效能提示

  • strlen 為 O(n),迴圈中重複呼叫極慢。→ 迴圈前快取長度:size_t len = strlen(s); for(i=0;i。
  • 大量字串拼接用 std::ostringstream 或預先 reserve 的 std::string,避免重複 strcat 導致 O(n²)。
  • 固定長度比較優先用 strncmp 或 memcmp,避免完整掃描。

熟練掌握這些基礎字串函式的行為邊界,是寫出健壯、高效 C/C++ 程式的基石。

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