[C語言日寄] 字符串操作函數的使用及其拓展

在這里插入圖片描述

【作者主頁】siy2333
【專欄介紹】?c語言日寄?:這是一個專注于C語言刷題的專欄,精選題目,搭配詳細題解、拓展算法。從基礎語法到復雜算法,題目涉及的知識點全面覆蓋,助力你系統提升。無論你是初學者,還是進階開發者,這里都能滿足你的需求!
【食用方法】1.根據題目自行嘗試 2.查看基礎思路完善題解 3.學習拓展算法
【Gitee鏈接】資源保存在我的Gitee倉庫:https://gitee.com/siy2333/study


文章目錄

  • 前言
  • 題目引入
  • 知識點分析
    • 1. 字符串的基本概念
    • 2. 常用字符串操作函數
      • (1)字符串拷貝函數:`strcpy()`
      • (2)字符串連接函數:`strcat()`
      • (3)字符串比較函數:`strcmp()`
      • (4)字符串長度函數:`strlen()`
      • (5)字符串查找函數:`strstr()`
    • 3. 字符串操作函數的底層實現
      • (1)`strcpy()` 的實現
      • (2)`strlen()` 的實現
  • 注意事項
    • 1. 字符串數組的空間大小
    • 2. 字符串的終止符 `\0`
    • 3. 避免使用 `gets()` 函數
    • 4. 字符串函數的返回值
  • 拓展應用
    • 1. 字符串反轉
    • 2. 字符串加密
    • 3. 字符串分割
    • 4. 字符串去重
  • 總結


前言

在C語言中,字符串是程序設計中不可或缺的一部分。C語言本身并沒有提供專門的字符串類型,而是通過字符數組來實現字符串操作。為了方便對字符串進行處理,C語言標準庫提供了豐富的字符串操作函數。今天,我們就通過一個簡單的程序來深入探討字符串操作函數的使用,以及它們在C語言中的重要性。


題目引入

下面是一個簡單的程序,它的輸出結果是:( )

#include <stdio.h>
#include <string.h>void print_string(const char *str) {printf("%s\n", str);
}int main() {char str1[20] = "Hello";char str2[20] = "World";strcat(str1, str2);print_string(str1);return 0;
}

A. Hello
B. World
C. HelloWorld
D. Hello World

在接下來的文章中,我們會一起把字符串操作函數的知識與題目結合起來,學習這一知識點。


知識點分析

1. 字符串的基本概念

在C語言中,字符串是以字符數組的形式存儲的,以空字符(\0)作為結束標志。例如:

char str[] = "Hello";

這里,str 是一個字符數組,包含 6 個字符:'H''e''l''l''o' 和一個空字符 '\0'。空字符是字符串的終止符,用于標識字符串的結束。

2. 常用字符串操作函數

C語言標準庫 <string.h> 提供了豐富的字符串操作函數,以下是一些常用的函數及其功能:

(1)字符串拷貝函數:strcpy()

strcpy() 函數用于將一個字符串拷貝到另一個字符串中。其函數原型為:

char *strcpy(char *dest, const char *src);
  • dest 是目標字符串,src 是源字符串。
  • 該函數會將 src 中的字符串(包括終止符 \0)拷貝到 dest 中。
  • 返回值是目標字符串的首地址。

示例:

char src[] = "Hello";
char dest[20];
strcpy(dest, src);
printf("%s\n", dest); // 輸出:Hello

(2)字符串連接函數:strcat()

strcat() 函數用于將一個字符串連接到另一個字符串的末尾。其函數原型為:

char *strcat(char *dest, const char *src);
  • dest 是目標字符串,src 是源字符串。
  • 該函數會將 src 中的字符串(不包括終止符 \0)連接到 dest 的末尾。
  • 返回值是目標字符串的首地址。

示例:

char str1[20] = "Hello";
char str2[] = "World";
strcat(str1, str2);
printf("%s\n", str1); // 輸出:HelloWorld

(3)字符串比較函數:strcmp()

strcmp() 函數用于比較兩個字符串的大小。其函數原型為:

int strcmp(const char *str1, const char *str2);
  • 如果 str1str2 相等,返回 0。
  • 如果 str1 小于 str2,返回負值。
  • 如果 str1 大于 str2,返回正值。

示例:

char str1[] = "apple";
char str2[] = "banana";
int result = strcmp(str1, str2);
printf("%d\n", result); // 輸出:負值

(4)字符串長度函數:strlen()

strlen() 函數用于計算字符串的長度(不包括終止符 \0)。其函數原型為:

size_t strlen(const char *str);

示例:

char str[] = "Hello";
size_t length = strlen(str);
printf("%zu\n", length); // 輸出:5

(5)字符串查找函數:strstr()

strstr() 函數用于在一個字符串中查找另一個字符串的首次出現位置。其函數原型為:

char *strstr(const char *haystack, const char *needle);
  • haystack 是被搜索的字符串,needle 是要查找的子字符串。
  • 如果找到子字符串,返回子字符串的首地址;否則返回 NULL

示例:

char str[] = "Hello World";
char *result = strstr(str, "World");
if (result) {printf("Found: %s\n", result); // 輸出:Found: World
} else {printf("Not found\n");
}

3. 字符串操作函數的底層實現

為了更好地理解字符串操作函數的工作原理,我們可以簡單分析一下它們的底層實現。

(1)strcpy() 的實現

char *strcpy(char *dest, const char *src) {char *tmp = dest;while ((*tmp++ = *src++) != '\0');return dest;
}
  • 通過一個循環,逐個拷貝源字符串中的字符到目標字符串中,直到遇到終止符 \0
  • 返回目標字符串的首地址。

(2)strlen() 的實現

size_t strlen(const char *str) {const char *tmp = str;while (*tmp++);return tmp - str;
}
  • 通過一個循環,逐個遍歷字符串中的字符,直到遇到終止符 \0
  • 返回字符串的長度。

注意事項

1. 字符串數組的空間大小

在使用字符串操作函數時,必須確保目標字符串數組有足夠的空間來存儲結果。例如,在使用 strcpy()strcat() 時,目標字符串數組的大小必須大于或等于源字符串的長度加上終止符 \0 的大小。

錯誤示例:

char src[] = "Hello World";
char dest[5];
strcpy(dest, src); // 錯誤:dest 空間不足

正確示例:

char src[] = "Hello World";
char dest[20];
strcpy(dest, src); // 正確:dest 空間足夠

2. 字符串的終止符 \0

在處理字符串時,必須確保字符串以終止符 \0 結尾。否則,可能會導致未定義行為,例如在使用 strlen()printf() 時,程序可能會讀取超出字符串范圍的內存。

錯誤示例:

char str[5] = {'H', 'e', 'l', 'l', 'o'};
printf("%s\n", str); // 錯誤:str 沒有終止符

正確示例:

char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
printf("%s\n", str); // 正確:str 有終止符

3. 避免使用 gets() 函數

gets() 函數用于從標準輸入讀取一行字符串,但它不會檢查目標緩沖區的大小,容易導致緩沖區溢出。因此,gets() 函數已經被廢棄,建議使用更安全的替代函數,如 fgets()

錯誤示例:

char str[20];
gets(str); // 錯誤:容易導致緩沖區溢出

正確示例:

char str[20];
fgets(str, sizeof(str), stdin); // 正確:更安全的替代

4. 字符串函數的返回值

在使用字符串函數時,需要注意它們的返回值。例如,strcpy()strcat() 返回目標字符串的首地址,而 strcmp() 返回一個整數值。正確使用返回值可以避免潛在的錯誤。

示例:

char str1[20] = "Hello";
char str2[] = "World";
char *result = strcat(str1, str2);
printf("%s\n", result); // 輸出:HelloWorld

拓展應用

1. 字符串反轉

字符串反轉是一個常見的應用場景,可以通過字符串操作函數實現。以下是一個簡單的字符串反轉函數:

#include <stdio.h>
#include <string.h>void reverse_string(char *str) {int length = strlen(str);for (int i = 0; i < length / 2; i++) {char temp = str[i];str[i] = str[length - i - 1];str[length - i - 1] = temp;}
}int main() {char str[] = "Hello";reverse_string(str);printf("%s\n", str); // 輸出:olleHreturn 0;
}

2. 字符串加密

字符串加密可以通過簡單的字符替換實現。以下是一個簡單的加密函數,將每個字符向后移動一個位置(字母表循環):

#include <stdio.h>
#include <string.h>void encrypt_string(char *str) {int length = strlen(str);for (int i = 0; i < length; i++) {if (str[i] >= 'a' && str[i] <= 'z') {str[i] = (str[i] - 'a' + 1) % 26 + 'a';} else if (str[i] >= 'A' && str[i] <= 'Z') {str[i] = (str[i] - 'A' + 1) % 26 + 'A';}}
}int main() {char str[] = "Hello";encrypt_string(str);printf("%s\n", str); // 輸出:Ifmmpreturn 0;
}

3. 字符串分割

字符串分割可以通過 strtok() 函數實現。以下是一個簡單的字符串分割示例,將字符串按空格分割:

#include <stdio.h>
#include <string.h>int main() {char str[] = "Hello World This is C";char *token = strtok(str, " ");while (token) {printf("%s\n", token);token = strtok(NULL, " ");}return 0;
}

4. 字符串去重

字符串去重可以通過遍歷字符串并刪除重復字符實現。以下是一個簡單的字符串去重函數:

#include <stdio.h>
#include <string.h>void remove_duplicates(char *str) {int length = strlen(str);for (int i = 0; i < length; i++) {for (int j = i + 1; j < length; j++) {if (str[i] == str[j]) {for (int k = j; k < length - 1; k++) {str[k] = str[k + 1];}length--;j--;}}}
}int main() {char str[] = "aabbccddeeff";remove_duplicates(str);printf("%s\n", str); // 輸出:abcdefreturn 0;
}

總結

字符串操作函數是C語言中非常重要的工具,它們可以幫助我們高效地處理字符串。
關注窩,每三天至少更新一篇優質c語言題目詳解~

[專欄鏈接QwQ] :?c語言日寄?CSDN
[關注博主ava]:siy2333
感謝觀看~ 我們下次再見!!

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

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

相關文章

Qt 進度條與多線程應用、基于 Qt 的文件復制工具開發

練習1&#xff1a;Qt 進度條與多線程應用 題目描述 開發一個基于 Qt 的應用程序&#xff0c;該應用程序包含一個水平進度條&#xff08;QSlider&#xff09;&#xff0c;并且需要通過多線程來更新進度條的值。請根據以下要求完成代碼&#xff1a; 界面設計&#xff1a; 使用 QS…

Gartner:數據安全平臺DSP提升數據流轉及使用安全

2025 年 1 月 7 日&#xff0c;Gartner 發布“China Context&#xff1a;Market Guide for Data Security Platforms”&#xff08;《數據安全平臺市場指南——中國篇》&#xff0c;以下簡稱指南&#xff09;&#xff0c;報告主要聚焦中國數據安全平臺&#xff08;Data Securit…

道可云人工智能每日資訊|《奇遇三星堆》VR沉浸探索展(淮安站)開展

道可云元宇宙每日簡報&#xff08;2025年3月5日&#xff09;訊&#xff0c;今日元宇宙新鮮事有&#xff1a; 《奇遇三星堆》VR沉浸探索展&#xff08;淮安站&#xff09;開展 近日&#xff0c;《奇遇三星堆》VR沉浸探索展&#xff08;淮安站&#xff09;開展。該展將三星堆文…

Spring AI Alibaba + Ollama:國產大模型DeepSeek LLM的低成本AI應用開發認知

寫在前面 官方文檔很詳細&#xff0c;有開發需求可以直接看文檔https://java2ai.com/docs/1.0.0-M5.1/get-started/博文內容為一個開發Demo&#xff0c;以及API簡單認知理解不足小伙伴幫忙指正 &#x1f603;,生活加油 我看遠山&#xff0c;遠山悲憫 持續分享技術干貨&#xf…

解決:Word 保存文檔失敗,重啟電腦后,Word 在試圖打開文件時遇到錯誤

殺千刀的微軟&#xff0c;設計的 Word 是個幾把&#xff0c;用 LaTex 寫完公式&#xff0c;然后保存&#xff0c;卡的飛起 我看文檔卡了很久&#xff0c;就關閉文檔&#xff0c;然后 TMD 腦抽了重啟電腦 重啟之后&#xff0c;文檔打不開了&#xff0c;顯示 殺千刀的&#xff…

掌握高效大模型任務流搭建術(二):鏈式流程如何賦能 AI 處理能力提升

前言&#xff1a; 在上一篇文章中&#xff0c;我們初步探索了 LangChain 的基礎鏈式操作——LLMChain。它巧妙地將大語言模型&#xff08;LLM&#xff09;與提示模板&#xff08;Prompt Template&#xff09;相結合&#xff0c;為模型交互邏輯的封裝提供了一種簡潔而高效的方式…

虛擬卡 WildCard (野卡) 保姆級開卡教程

本文首發于只抄博客&#xff0c;歡迎點擊原文鏈接了解更多內容。 前言 本篇教程為 WildCard 的介紹以及開卡教學&#xff0c;要了解不同平臺&#xff08;Grok、Talkatone 等&#xff09;的訂閱方式請移步《訂閱教程》分類 當我們想要充值國外平臺會員時&#xff0c;一般都需要使…

計算機數據庫三級刷題總結(博主89分已過,總結的內容分享)

計算機數據庫三級刷題總結&#xff08;博主89分已過&#xff0c;總結的內容分享&#xff09; 文章目錄 計算機數據庫三級刷題總結&#xff08;博主89分已過&#xff0c;總結的內容分享&#xff09;一、 數據庫設計階段二、事務相關三、數據庫設計順序四、數據庫三級模式與二層映…

記錄一些面試遇到的問題

重載和重寫的區別 重載是overload&#xff0c;覆蓋是override 重載屬于編譯時多態&#xff0c;覆蓋屬于運行時多態 運行時多態和編譯時多態 運行時多態指的是在運行的時候才知道要調用哪一個函數&#xff0c;編譯時多態是指在編譯的時候就知道調用哪一個函數。 運行時多態…

HBuilder X 使用 TortoiseSVN 設置快捷鍵方法

HBuilder X 使用 TortoiseSVN 設置快捷鍵方法 單文件&#xff1a;(上鎖&#xff0c;解鎖&#xff0c;提交&#xff0c;更新) 安裝好 TortoiseSVN &#xff0c;或者 按圖操作&#xff1a; 1&#xff0c;工具欄中 【自定義快捷鍵】 2&#xff0c;點擊 默認的快捷鍵設置&…

JmeterHttp請求頭管理出現Unsupported Media Type問題解決

JmeterHttp請求頭管理出現Unsupported Media Type問題解決 大多數的app與pc端壓測的時候都會出現這種情況 當我們在jemter測試當中當中遇見Unsupported Media Type&#xff0c;有一種可能就是我們請求的網頁的content-Type的類型與我們測試的時候的類型不一致 解決方法 可以添…

Spring AI 1.0.0-M6 快速開始(一)

Spring AI 1.0.0-M6 入門一、存儲庫二、依賴管理完整maven 入門 Spring 是JAVA中我們經常使用的框架之一&#xff0c;Spring AI不斷的發展迭代目前已經到M6版本據說上半年會出一個穩定版本。 本節提供了如何開始使用Spring AI的M6。 一、存儲庫 1.0 M6 -添加Spring存儲庫 需…

頂點著色器和片段著色器

在Unity渲染中&#xff0c;**頂點著色器&#xff08;Vertex Shader&#xff09;和片段著色器&#xff08;Fragment Shader&#xff09;**是圖形渲染管線中的兩個核心階段。我們可以通過一個比喻來理解它們的分工&#xff1a;想象你要畫一幅由三角形組成的3D模型&#xff0c;頂點…

Impacket工具中的橫向滲透利器及其使用場景對比詳解

在滲透測試中&#xff0c;橫向移動&#xff08;Lateral Movement&#xff09;是指攻擊者在獲得一個系統的控制權限后&#xff0c;通過網絡進一步滲透到其他系統的過程。Impacket 是一款強大的滲透測試工具集&#xff0c;提供了多種實現橫向滲透的腳本&#xff0c;常見的工具包括…

設計模式|策略模式 Strategy Pattern 詳解

目錄 一、策略模式概述二、策略模式的實現2.1 策略接口2.2 具體策略類2.3 上下文類2.4 客戶端代碼2.5 UML類圖2.6 UML時序圖 三、優缺點3.1 ?優點3.2 ? 缺點 四、最佳實踐場景4.1 適合場景描述4.2 具體場景 五、擴展5.1 繼承復用機制和復合策略5.2 對象管理&#xff1a;優化策…

迷你世界腳本顯示板管理接口:DisPlayBoard

顯示板管理接口&#xff1a;DisPlayBoard 迷你世界 更新時間: 2023-04-26 10:21:14 具體函數名及描述如下: 序號 函數名 函數描述 1 showBoard(...) 對玩家顯示顯示板 2 hideBoard(...) 對玩家隱藏顯示板 3 setBoardPicture 對玩家設置顯示板的圖片…

尚硅谷爬蟲note14

一、scrapy scrapy&#xff1a;為爬取網站數據是&#xff0c;提取結構性數據而編寫的應用框架 1. 安裝 pip install scrapy 或者&#xff0c;國內源安裝 pip install scrapy -i https&#xff1a;//pypi.douban.com/simple 2. 報錯 報錯1&#xff09;building ‘twisted.te…

merge函數

merge函數 今天在刷lc&#xff0c;從靈神題解中學到的 來源&#xff1a;560. 和為 K 的子數組 - 力扣&#xff08;LeetCode&#xff09; java8 merge()方法被引入到HashMap類中&#xff0c;用于簡化鍵值對操作&#xff0c;在處理鍵值對時&#xff0c;提供一個重新映射函數來決…

Notepad++ 8.6.7 安裝與配置全攻略(Windows平臺)

一、軟件定位與核心優勢 Notepad 是開源免費的代碼/文本編輯器&#xff0c;支持超過80種編程語言的高亮顯示&#xff0c;相比系統自帶記事本具有以下優勢&#xff1a; 輕量高效&#xff1a;啟動速度比同類軟件快30%插件擴展&#xff1a;支持NppExec、JSON Viewer等200插件跨文…

建筑兔零基礎自學python記錄39|實戰詞云可視化項目——章節分布10(上)

這次我們來制作《紅樓夢》各章節的分布情況&#xff1a; 源代碼&#xff1a; import pandas as pd import numpy as np import matplotlib.pyplot as pltdf_hlm pd.read_csv("hlm.txt", names["hlm_texts"]).dropna()df_hlm df_hlm[~df_hlm.hlm_texts.s…