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

C語言字符串函數完全指南:strcpy、strcat、strcmp、strlen 實戰詳解

     編輯:關於C語言

C語言字符串函數完全指南:strcpy、strcat、strcmp、strlen 實戰詳解

字符串處理是C語言程式設計的高頻需求。本文系統梳理 <string.h> 核心函數,並通過實戰案例演示正確用法與常見陷阱。

一、核心函數速查表

函數原型功能返回值注意事項
strlensize_t strlen(const char *s)計算字符串長度長度(不含\0)遇\0停止,必須保證字符串正確終止
strcpychar *strcpy(char *dest, const char *src)複製字符串dest需確保dest空間≥src長度+1,否則溢出
strcatchar *strcat(char *dest, const char *src)拼接字符串destdest必須有足夠空間,src接在dest\0後
strcmpint strcmp(const char *s1, const char *s2)比較字符串<0, =0, >0按ASCII碼逐字符比較,區分大小寫
strchrchar *strchr(const char *s, int c)查找字符首次出現指針/NULL包含\0在搜索範圍內
strstrchar *strstr(const char *haystack, const char *needle)查找子串首次出現指針/NULL子串為空返回haystack

二、基礎用法演示

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

int main() {
    char s1[] = "I am a student";
    char s2[20] = "teacher";
    char s3[] = "student";
    char s4[20], *p;
    int result;

    // 1. 長度
    printf("len(s1)=%zu, len(s2)=%zu\n", strlen(s1), strlen(s2)); // 14, 7

    // 2. 複製
    strcpy(s4, s2);
    printf("s4=%s\n", s4); // teacher

    // 3. 比較
    result = strcmp(s2, s3); // 't' > 's' -> 正數
    printf("cmp=%d\n", result);

    // 4. 字符定位
    p = strchr(s1, 's');
    printf("strchr=%s\n", p); // student

    // 5. 子串查找
    p = strstr(s1, s3);
    printf("strstr=%s\n", p); // student

    // 6. 拼接
    strcat(s2, s3);
    printf("s2=%s\n", s2); // teacherstudent

    return 0;
}

三、實戰案例:姓名格式轉換

將 "jie wang" 轉換為 "wang,jie" 格式:

void ReverseName(char *name, char *newName) {
    char *p = strchr(name, ' ');  // 定位空格
    *p = '\0';                    // 截斷為 "jie"
    printf("first=%s\n", name);   // jie
    printf("rest=%s\n", p);       // (空字符)

    strcpy(newName, p + 1);       // 複製 "wang" -> newName
    strcat(newName, ",");         // 拼接 "," -> "wang,"
    strcat(newName, name);        // 拼接 "jie" -> "wang,jie"
    *p = ' ';                     // 恢復原字符串
    printf("original=%s\n", name); // jie wang
}

int main() {
    char name[] = "jie wang", newName[30];
    ReverseName(name, newName);
    printf("result=%s\n", newName); // wang,jie
    return 0;
}

四、高危陷阱與最佳實踐

⚠️ 緩衝區溢出風險

  • strcpy/strcat 不檢查目標空間,必須確保目標緩衝區足夠大
  • 現代代碼優先使用 strncpy、strncat、snprintf 等帶長度限制的版本

✅ 安全替代方案

// 安全複製
strncpy(dest, src, sizeof(dest)-1);
dest[sizeof(dest)-1] = '\0';

// 安全拼接
strncat(dest, src, sizeof(dest) - strlen(dest) - 1);

// 格式化輸出(最推薦)
snprintf(dest, sizeof(dest), "%s%s", str1, str2);

五、字符串比較陷阱

char *a = "hello";
char *b = "hello";
// 錯誤:比較地址
if (a == b) ...  // 可能為真(字面量合併),也可能為假

// 正確:比較內容
if (strcmp(a, b) == 0) ...  // 內容相等

六、總結

  1. 熟練掌握 strlen/strcpy/strcat/strcmp/strchr/strstr 六大核心函數
  2. 永遠記住:目標緩衝區大小是程序員的責任
  3. 新代碼優先用 snprintf 替代 strcpy/strcat 組合
  4. 字符串比較只能用 strcmp,絕不直接比較指針
  5. 理解 \0 的關鍵作用:所有字符串函數都依賴它作為邊界

字符串處理看似簡單,實則暗藏記憶體安全隱患。養成防御性編程習慣,是C程序員的基本功。

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