[學習] C語言<string.h>中字符串函數全解析

C語言<string.h>中字符串函數全解析

在 C 語言中,字符串處理是程序開發中的重要組成部分。C 標準庫 <string.h> 提供了一系列函數用于操作字符數組(即字符串)。這些函數以 str 開頭,功能強大、使用廣泛,掌握它們對編寫高效、安全的字符串處理代碼至關重要。

下面將詳細介紹所有常用的字符串處理函數,包括其 函數原型參數說明返回值含義 以及 完整示例代碼

📢 如果你正在學習 C 語言或準備面試,請收藏此篇,作為你的字符串函數速查手冊!


文章目錄

  • C語言<string.h>中字符串函數全解析
    • 🔹1. `strcpy()` —— 字符串拷貝
      • 函數原型:
      • 完整示例:
    • 🔹2. `strncpy()` —— 指定長度的字符串拷貝
      • 函數原型:
      • 完整示例:
    • 🔹3. `strcat()` —— 字符串拼接
      • 函數原型:
      • 完整示例:
    • 🔹4. `strncat()` —— 指定長度的字符串拼接
      • 函數原型:
      • 完整示例:
    • 🔹5. `strcmp()` —— 字符串比較
      • 函數原型:
      • 完整示例:
    • 🔹6. `strncmp()` —— 指定長度的字符串比較
      • 函數原型:
      • 完整示例:
    • 🔹7. `strlen()` —— 獲取字符串長度
      • 函數原型:
      • 完整示例:
    • 🔹8. `strchr()` —— 查找字符首次出現位置
      • 函數原型:
      • 完整示例:
    • 🔹9. `strrchr()` —— 查找字符最后一次出現位置
      • 函數原型:
      • 完整示例:
    • 🔹10. `strstr()` —— 查找子字符串首次出現位置
      • 函數原型:
      • 完整示例:
    • 🔹11. `strspn()` —— 計算前綴匹配長度
      • 函數原型:
      • 完整示例:
    • 🔹12. `strcspn()` —— 計算前綴不含某字符集的長度
      • 函數原型:
      • 完整示例:
    • 🔹13. `strpbrk()` —— 查找第一個出現在指定字符集中的字符
      • 函數原型:
      • 完整示例:
    • 🔹14. `strdup()` —— 字符串復制(非標準但常用)
      • 函數原型(POSIX擴展):
      • 完整示例:
    • 🔹15. `strndup()` —— 指定長度的字符串復制(GNU擴展)
      • 函數原型:
      • 完整示例:
    • 🔹16. `strerror()` —— 根據錯誤碼獲取描述信息
      • 函數原型:
      • 完整示例:
    • 🔹17. `strtok()` / `strtok_r()` —— 字符串分割
      • 函數原型:
      • 完整示例(strtok):
      • 完整示例(strtok_r):
    • 🔹18. `strcoll()` —— 按照當前區域設置比較字符串
      • 函數原型:
      • 完整示例:
    • 🔹19. `strxfrm()` —— 將字符串轉換為可排序形式
      • 函數原型:
      • 完整示例:
    • ? 總結表格


🔹1. strcpy() —— 字符串拷貝

函數原型:

char *strcpy(char *dest, const char *src);

完整示例:

#include <stdio.h>
#include <string.h>int main() {char src[] = "Hello World";char dest[50];strcpy(dest, src);printf("Copied string: %s\n", dest);return 0;
}

🔹2. strncpy() —— 指定長度的字符串拷貝

函數原型:

char *strncpy(char *dest, const char *src, size_t n);

完整示例:

#include <stdio.h>
#include <string.h>int main() {char src[] = "abcdefg";char dest[10];strncpy(dest, src, 3);dest[3] = '\0'; // 手動補結束符printf("Copied substring: %s\n", dest);return 0;
}

🔹3. strcat() —— 字符串拼接

函數原型:

char *strcat(char *dest, const char *src);

完整示例:

#include <stdio.h>
#include <string.h>int main() {char dest[50] = "Hello ";strcat(dest, "World");printf("Concatenated string: %s\n", dest);return 0;
}

🔹4. strncat() —— 指定長度的字符串拼接

函數原型:

char *strncat(char *dest, const char *src, size_t n);

完整示例:

#include <stdio.h>
#include <string.h>int main() {char dest[50] = "Hello ";strncat(dest, "World!", 3);printf("Concatenated substring: %s\n", dest);return 0;
}

🔹5. strcmp() —— 字符串比較

函數原型:

int strcmp(const char *s1, const char *s2);

完整示例:

#include <stdio.h>
#include <string.h>int main() {if (strcmp("apple", "banana") < 0) {printf("apple comes before banana\n");} else {printf("apple does not come before banana\n");}return 0;
}

🔹6. strncmp() —— 指定長度的字符串比較

函數原型:

int strncmp(const char *s1, const char *s2, size_t n);

完整示例:

#include <stdio.h>
#include <string.h>int main() {if (strncmp("hello world", "hello there", 5) == 0) {printf("First 5 characters are equal.\n");} else {printf("First 5 characters are different.\n");}return 0;
}

🔹7. strlen() —— 獲取字符串長度

函數原型:

size_t strlen(const char *s);

完整示例:

#include <stdio.h>
#include <string.h>int main() {char str[] = "Hello";printf("Length of '%s': %zu\n", str, strlen(str));return 0;
}

🔹8. strchr() —— 查找字符首次出現位置

函數原型:

char *strchr(const char *s, int c);

完整示例:

#include <stdio.h>
#include <string.h>int main() {const char *str = "abcdefg";char *p = strchr(str, 'd');if (p) {printf("Found 'd' at position: %ld\n", p - str);} else {printf("'d' not found\n");}return 0;
}

🔹9. strrchr() —— 查找字符最后一次出現位置

函數原型:

char *strrchr(const char *s, int c);

完整示例:

#include <stdio.h>
#include <string.h>int main() {const char *str = "abracadabra";char *p = strrchr(str, 'a');if (p) {printf("Last 'a' at index: %ld\n", p - str);} else {printf("'a' not found\n");}return 0;
}

🔹10. strstr() —— 查找子字符串首次出現位置

函數原型:

char *strstr(const char *haystack, const char *needle);

完整示例:

#include <stdio.h>
#include <string.h>int main() {const char *text = "Hello World";const char *pattern = "World";char *p = strstr(text, pattern);if (p) {printf("Found '%s' at index: %ld\n", pattern, p - text);} else {printf("'%s' not found\n", pattern);}return 0;
}

🔹11. strspn() —— 計算前綴匹配長度

函數原型:

size_t strspn(const char *s, const char *accept);

完整示例:

#include <stdio.h>
#include <string.h>int main() {const char *str = "123abc";const char *digits = "0123456789";size_t len = strspn(str, digits);printf("Prefix length: %zu\n", len); // 輸出 3return 0;
}

🔹12. strcspn() —— 計算前綴不含某字符集的長度

函數原型:

size_t strcspn(const char *s, const char *reject);

完整示例:

#include <stdio.h>
#include <string.h>int main() {const char *str = "hello world";size_t len = strcspn(str, " ");printf("First word length: %zu\n", len); // 輸出 5return 0;
}

🔹13. strpbrk() —— 查找第一個出現在指定字符集中的字符

函數原型:

char *strpbrk(const char *s, const char *accept);

完整示例:

#include <stdio.h>
#include <string.h>int main() {const char *str = "abcdefg";const char *chars = "xyzc";char *p = strpbrk(str, chars);if (p) {printf("Found '%c' at index: %ld\n", *p, p - str);} else {printf("No match found\n");}return 0;
}

🔹14. strdup() —— 字符串復制(非標準但常用)

函數原型(POSIX擴展):

char *strdup(const char *s);

完整示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {const char *original = "Dynamic copy";char *copy = strdup(original);if (copy) {printf("Copy: %s\n", copy);free(copy);} else {printf("Memory allocation failed\n");}return 0;
}

🔹15. strndup() —— 指定長度的字符串復制(GNU擴展)

函數原型:

char *strndup(const char *s, size_t n);

完整示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {const char *original = "abcdefgh";char *copy = strndup(original, 4);if (copy) {printf("Copy: %s\n", copy);free(copy);} else {printf("Memory allocation failed\n");}return 0;
}

🔹16. strerror() —— 根據錯誤碼獲取描述信息

函數原型:

char *strerror(int errnum);

完整示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main() {FILE *fp = fopen("nonexistent.txt", "r");if (!fp) {printf("Error: %s\n", strerror(errno));}return 0;
}

🔹17. strtok() / strtok_r() —— 字符串分割

函數原型:

char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr); // 線程安全版本

完整示例(strtok):

#include <stdio.h>
#include <string.h>int main() {char str[] = "apple,banana,orange";char *token = strtok(str, ",");while (token) {printf("Token: %s\n", token);token = strtok(NULL, ",");}return 0;
}

完整示例(strtok_r):

#include <stdio.h>
#include <string.h>int main() {char str[] = "apple,banana,orange";char *saveptr;char *token = strtok_r(str, ",", &saveptr);while (token) {printf("Token: %s\n", token);token = strtok_r(NULL, ",", &saveptr);}return 0;
}

🔹18. strcoll() —— 按照當前區域設置比較字符串

函數原型:

int strcoll(const char *s1, const char *s2);

完整示例:

#include <stdio.h>
#include <string.h>
#include <locale.h>int main() {setlocale(LC_COLLATE, "zh_CN.UTF-8"); // 設置中文區域const char *s1 = "蘋果";const char *s2 = "香蕉";int result = strcoll(s1, s2);if (result < 0) {printf("%s comes before %s\n", s1, s2);} else if (result > 0) {printf("%s comes after %s\n", s1, s2);} else {printf("%s and %s are equal\n", s1, s2);}return 0;
}

🔹19. strxfrm() —— 將字符串轉換為可排序形式

函數原型:

size_t strxfrm(char *dest, const char *src, size_t n);

完整示例:

#include <stdio.h>
#include <string.h>
#include <locale.h>int main() {setlocale(LC_COLLATE, "zh_CN.UTF-8");const char *src = "蘋果";char dest[100];size_t len = strxfrm(dest, src, sizeof(dest));printf("Transformed string: %s (length: %zu)\n", dest, len);return 0;
}

? 總結表格

函數名功能是否線程安全頭文件
strcpy拷貝字符串?<string.h>
strncpy指定長度拷貝?<string.h>
strcat拼接字符串?<string.h>
strncat指定長度拼接?<string.h>
strcmp比較字符串?<string.h>
strncmp指定長度比較?<string.h>
strlen獲取字符串長度?<string.h>
strchr查找字符首次出現?<string.h>
strrchr查找字符最后一次出現?<string.h>
strstr查找子字符串?<string.h>
strspn匹配前綴字符?<string.h>
strcspn匹配前綴不含字符?<string.h>
strpbrk查找任意字符首次出現?<string.h>
strdup復制字符串(需手動釋放)?<string.h>
strndup指定長度復制?<string.h>
strerror錯誤碼轉字符串?<string.h> <errno.h>
strtok/strtok_r分割字符串? / ?<string.h>
strcoll按區域設置比較?<string.h>
strxfrm轉換為可排序形式?<string.h>

📌 提示建議:

  • 使用時務必注意邊界和空指針問題;
  • 推薦使用更安全的替代函數如 strncpy, strncat
  • 在多線程環境中優先使用 _r 版本(如 strtok_r);
  • 對字符串操作頻繁的項目可考慮使用 C++ 的 std::string 或其他封裝庫。

研究學習不易,點贊易。
工作生活不易,收藏易,點收藏不迷茫 :)


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85739.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85739.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85739.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OJ搭建:Judge0服務器、DeepSeek服務接入簡介

序 各大OJ平臺上有很多很好的資源&#xff0c;但作為自己的“備課本”總有各種不便&#xff0c;教學生時間久了總是有一些自己的題目和想法&#xff0c;這在教初學的學生時非常突出。所以&#xff0c;很多年前就搞了一些嘗試&#xff0c;包括&#xff1a;在機房搭建ubuntu服務器…

Java的鎖機制問題

鎖機制 1.鎖監視器 在 Java 并發編程中&#xff0c;鎖監視器&#xff08;Monitor&#xff09; 是對象內部與鎖關聯的同步機制&#xff0c;用于控制多線程對共享資源的訪問。以下是核心要點&#xff1a; &#x1f512; 監視器的核心組成 獨占區&#xff08;Ownership&#xff…

老鳳祥的AI智能眼鏡:讓智慧更近生活

在科技進步的潮流中,人工智能技術不斷為我們的生活增添色彩。近日,有關字節跳動旗下的火山引擎與中國珠寶品牌老鳳祥合作開發 AI 智能眼鏡的消息引發了廣泛關注。這款與眾不同的眼鏡因其獨特的功能及技術支持,已經在業內引起了極大反響。 AI眼鏡:老年群體的智能好幫手 根…

Kotlin 中為什么沒有靜態變量和靜態方法—不用static?

Kotlin 的設計核心是&#xff1a; 一切皆對象&#xff1a;消除 static 的「非對象」特性&#xff0c;用 companion&#xff08;對象&#xff09;和頂層函數&#xff08;包級對象&#xff09;替代&#xff0c;讓代碼更統一。避免全局狀態濫用&#xff1a;static 成員是全局可見…

VSCode性能調優:從卡頓到絲滑的終極方案

? 核心價值 "這套配置使某金融核心系統VS Code內存占用從8GB降至1.2GB,加載速度提升15倍" —— 2024某銀行效能優化報告 ?? 性能瓶頸拆解 一、百萬行項目優化方案 ?? 黃金配置參數 // settings.json(核彈級優化) {"files.watcherExclude": {"…

以云織夢,渡數濟世:輝瑞與亞馬遜云科技共譜醫藥新樂章

胖頭陀科技 編輯&#xff1a;沐由 【導讀】“用合規的數據來幫助患者&#xff0c;成為患者回歸健康的一味新藥。”當下&#xff0c;在數字洪流的浪潮中&#xff0c;這味“良藥”正沿著云和AI的脈絡&#xff0c;奔向有需求的千家萬戶…… 如果說到Pfizer&#xff0c;估計十個人…

SpringBoot后端開發知識點總結(持續更新)

目錄 1. 常用易混淆注解解釋1.1 Resource和Autowired注解的區別1.2 PathVariable和RequestParam注解的區別 2. Mybatis-Plus高級特性2.1 強大的通用CRUD接口2.2 代碼生成器 3. IDEA實用快捷鍵4. 前后端聯調關鍵點4.1 代碼示例4.2 聯調要點4.3 調試技巧 1. 常用易混淆注解解釋 …

電腦商城--用戶收貨管理

新增收貨地址 1 新增收貨地址-創建數據表 1.使用use命令先選中store數據庫。 USE store; 2.在store數據庫中創建t_address用戶數據表。 CREATE TABLE t_address (aid INT AUTO_INCREMENT COMMENT 收貨地址id,uid INT COMMENT 歸屬的用戶id,name VARCHAR(20) COMMENT 收貨人姓…

開發者避坑:接入Flux-Kontext API實現文生圖、圖生圖功能

在數字化浪潮背景下&#xff0c;人工智能&#xff08;Artificial Intelligence, AI&#xff09;技術正加速重塑圖像創作領域。智創聚合API平臺近日宣布整合Flux-Kontext系列模型&#xff0c;通過API接口支持圖生圖和文生圖功能&#xff0c;為開發者及創作者提供高效解決方案。此…

.Net Core 獲取與bin目錄相同文件路徑的文件

在 .NET Core 中&#xff0c;您可以使用以下方法來獲取與 bin 目錄相同的文件路徑。通常&#xff0c;bin 目錄是應用程序編譯后生成的輸出目錄&#xff0c;您可以使用 AppContext.BaseDirectory 或 Directory.GetCurrentDirectory() 來獲取該目錄的路徑。 以下是一些常用的方法…

RN(React Native)技術應用中常出現的錯誤及解決辦法

React Native 作為跨平臺開發框架&#xff0c;在實際應用中可能會遇到一些常見的錯誤。以下是React Native 技術應用中常出現的錯誤及解決辦法&#xff1a; 1. 網絡請求失敗&#xff08;Network Request Failed&#xff09; 原因&#xff1a; 請求地址不正確網絡權限未配置i…

Java 21 的虛擬線程與橋接模式:構建高性能并發系統

Java 21 的虛擬線程與橋接模式&#xff1a;構建高性能并發系統 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 總有一行代碼&#xff0c;能點亮萬千星辰。 &#x1f50d; 在技術的宇宙中&#xff0c;我愿做永不停歇的探索者。 ? 用代碼丈量世界&…

HTML5 火焰字體效果教程

HTML5 火焰字體效果教程 這里寫目錄標題 HTML5 火焰字體效果教程前言項目概述基本原理項目結構詳細實現步驟1. HTML結構2. CSS樣式3. JavaScript實現 代碼詳解1. 初始化設置2. 粒子系統3. 生成粒子4. 動畫循環5. 交互控制 擴展和優化建議總結完整代碼 前言 在這篇教程中&#…

SMOTE-XGBoost實戰:金融風控中欺詐檢測的樣本不平衡解決方案

1. 行業問題背景 &#xff08;1&#xff09;金融欺詐檢測的特殊性 在支付風控領域&#xff0c;樣本不平衡是核心痛點。Visa 2023年度報告顯示&#xff0c;全球信用卡欺詐率約為0.6%&#xff0c;但單筆欺詐交易平均損失高達$500。傳統機器學習模型在此場景下表現堪憂&#xff1…

Instagram下載保存 -下載狗解析工具

在日常瀏覽Instagram時&#xff0c;是否有過這樣的煩惱&#xff1a;看到一個精彩的視頻&#xff0c;想要保存下來&#xff0c;卻不知道如何操作&#xff1f;有時候我們會看到一些特別的旅行視頻、搞笑片段&#xff0c;甚至是喜歡的名人分享的內容&#xff0c;簡直是舍不得錯過。…

flink如何基于Pekko實現RPC調用

摘要 通過閱讀flink源碼&#xff0c;了解flink是如何基于Pekko實現遠程RPC調用的 Pekko實現遠程調用 Flink 的 RPC 框架底層是構建在 Pekko 的 actor 模型之上的&#xff0c;了解Pekko如何使用&#xff0c;對后續源碼的閱讀有幫助。 Apache Pekko&#xff08;原為 Akka 的一…

Kafka節點注冊沖突問題分析與解決

一、核心錯誤分析 ERROR Error while creating ephemeral at /brokers/ids/1, node already exists and owner does not match org.apache.zookeeper.KeeperException$NodeExistsException: KeeperErrorCode NodeExists問題本質&#xff1a;ZooKeeper中已存在ID為1的broker節…

突破PPO訓練效率瓶頸!字節跳動提出T-PPO,推理LLM訓練速度提升2.5倍

突破PPO訓練效率瓶頸&#xff01;字節跳動提出T-PPO&#xff0c;推理LLM訓練速度提升2.5倍 在大語言模型&#xff08;LLM&#xff09;通過長思維鏈&#xff08;CoT&#xff09;展現出強大推理能力的當下&#xff0c;強化學習&#xff08;RL&#xff09;作為關鍵技術卻面臨訓練…

【Python】dictionary

1 字典功能 字典是可變容器模型&#xff0c;且可存儲任意類型對象&#xff1b; 字典的每個鍵值對 <key: value> 用冒號 : 分割&#xff0c;每個對之間用逗號(,)分割&#xff0c;整個字典包括在花括號 {} 中 ,格式如下所示&#xff1a; d {key1 : value1, key2 : value…

【python】If 語句

1 使用if 進行條件判斷 1.1 檢查字符串是否相等 car bmw car BMW # FALSEcar bmw car.upper() BMW # true # 變小寫用方法&#xff1a;lower1.2 檢查字符串是否不相等 my_car yadeaif my_car ! Audi:print("Buy one! Buy one! Buy one!")1.3 比較數字 answe…