#C語言——學習攻略:探索字符函數和字符串函數(一)--字符分類函數,字符轉換函數,strlen,strcpy,strcat函數的使用和模擬實現

🌟菜鳥主頁:@晨非辰的主頁

👀學習專欄:《C語言學習》

💪學習階段:C語言方向初學者

?名言欣賞:"編程的本質是理解問題,然后把它分解成可執行的步驟。"


目錄

1. 字符分類函數

2. 字符轉換函數

3. strlen函數

3.1 strlen函數使用示范

3.2 strlen的返回值

? 3.3 模擬實現strlen函數

4.?strcpy函數(格式符隱式解引用)

4.1 strcpy函數使用示范

4.2 模擬實現strcpy函數

5. strcat函數

5.1 strcat函數使用示范

5.2 模擬實現strcat函數


1. 字符分類函數

--在C語言中有一系列函數專門做字符分類判斷一個字符屬于什么類型的字符。

--以下函數都需要包含頭文件:<ctype.h>

? ? ? ?

--這些函數的使用方式十分相似,下面就將一個函數為例解釋:?islower 函數

int lower(int a);

????????--函數判斷字母是否為小寫字母,是-返回非0整數,不是-返回0;

--練習:通過代碼將字符串中的小寫字母轉換為大寫字母:

#include <stdio.h>
#include <ctype.h>
int main()
{char arr[] = "Im a Chinese!";int i = 0;;while (arr[i]){if (islower(arr[i])){arr[i] -= 32;//大寫字母Ascll碼值與小寫字母差32}printf("%c", arr[i]);i++;}return 0;
}

2. 字符轉換函數

--除了上述的字符分類函數,還有這實現字符之間轉換的字符轉化函數;

--使用時包含頭文件:<ctype.h>

int tolower(int c);  將傳進去的大寫字母轉換為小寫字母;
int toupper(int c);  將傳進去的小寫字母轉換為大寫字母;

--有了這兩個函數就可以直接實現大小寫轉換,不用在+-32進行。

--練習:通過代碼利用上述兩個函數實現將字符串中的小寫字符轉換為大寫:

int main()
{char arr[] = "Im a Chinese!";int i = 0;while (arr[i]){if (islower(arr[i])){arr[i] = toupper(arr[i]);}printf("%c", arr[i]);i++;}return 0;
}

3. strlen函數

size_t strlen (const char* str);

--介紹:?

  • 參數: str?—— 指向 '\0'?結尾的字符串的指針;

  • 返回值: size_t?類型的無符號整數,表示字符串的長度(不含 '\0' );

  • 核心功能:計算字符串長度從起始地址開始遍歷,直到遇到 '\0' 結束。

3.1 strlen函數使用示范

--使用須知:

  • ?字符串以 '\0'?作為結束標志,strlen函數返回的是在字符串中?'\0'?前面出現的字符個數(不包含?'\0'?);
  • 參數指向的字符串必須要以?'\0'?結束;
  • 注意函數的返回值為 size_t,是無符號的( 易錯 );
  • strlen的使用需要包含頭文件<string.h>;
#include <string.h>
int main()
{const char* str = "abcdef";printf("%zd\n", strlen(str));return 0;
}

3.2 strlen的返回值

--為什么說返回值 size_t類型易錯?請看下面代碼:

#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if (strlen(str2) - strlen(str1) > 0)//一般認為輸出<=,但實際不是{printf(">\n")else{printf("<=\n");}return 0;
}

????????--一般認為上面 3-6 輸出 <=,但實際不是?,輸出 > :因為函數返回類型為無符號整型,所以運算結果也為無符號整型(>=0);想讓它符合我們的認知,可以將類型強轉為 int :

int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if ((int)strlen(str2) - (int)strlen(str1) > 0){printf(">\n");}else{printf("<=\n");}return 0;
}

? 3.3 模擬實現strlen函數

?--下面將呈現三種方法·,其中兩種方式在前面已經見過:

--方式1:計算器

#include <assert.h>
size_t strlen(char* str)
{int count = 0;int i = 0;assert(str != NULL);while (*str){count++;str++;}return count;
}int main()
{char arr[] = "abcdef";size_t re = strlen(arr);printf("%d\n", re);return 0;
}

--方式2:指針-指針(參考:4.2部分--#C語言——學習攻略:深挖指針路線(一))

size_t my_strlen(char* str)
{assert(str != NULL);char* p = str;while (*str){str++;}return str - p;
}
int main()
{char arr[] = "abcdef";size_t ret = my_strlen(arr);printf("%zd\n", ret);return 0;
}

--方式3:函數遞歸

size_t my_strlen(const char* str)
{assert(str != NULL);if (*str == '\0'){return 0;}else{return 1 + my_strlen(str + 1);}}
int main()
{char arr[] = "abcdef";size_t ret = my_strlen(arr);printf("%d", ret);return 0;
}


4.?strcpy函數(格式符隱式解引用)

char* strcpy(char* destination, cjar* source);

--介紹:

  • 功能:字符串拷貝,將源頭(src)的字符串拷貝到目標(dest )空間中,拷貝到源頭字符串中的 '\0' 為止;

  • 返回值:strcpy函數返回的目標空間的起始地址;

  • 參數:?destination指針,指向目的地空間;source指針,指向源頭數據。

4.1 strcpy函數使用示范

使用須知——

  • 源字符串必須以?'\0'?結束;
  • 會將源字符串中的?'\0'?拷貝到目標空間;
  • 目標空間必須足夠大,以確保能存放源字符串,[ ]里不能為空;
  • 目標空間必須可修改(字符串數組),比如常量字符串無法修改;?
  • 使用需要包含頭文件<string.h>;
int main()
{char arr1[] = "hello";char arr2[20] = { 0 };char* ret = strcpy(arr2, arr1);printf("%s\n", ret);    無需解引用,%s 自動處理return 0;
}

隱式解引用:

--對于為什么輸出 ret 不使用 %p :當要輸出指針指向的內容時 %s?格式符本質上會隱式解引用指針,


4.2 模擬實現strcpy函數

void my_strcpy(char* dest, char* src)
{while (*dest++ = *src++){;}}
int main()
{char arr1[] = "hello world!";char arr2[] = "*************";my_strcpy(arr2, arr1);printf("%s\n", arr2);return 0;
}

5. strcat函數

 char* strcat(char* destination, const char* source);

--介紹:

  • 功能:字符串追加,把source指針的源字符串中的所有字符都追加到destination指向的空間中;
  • 參數:destination指針,指向目的地空間;source指針,指向源頭數據;
  • 返回值:strcat函數返回的目標空間的起始地址;

5.1 strcat函數使用示范

使用須知——

  • 源字符串必須以 '\0'?結束;
  • 目標字符串中也得有?\0?,否則無法知道追加從哪開始;
  • 目標空間必須有足夠的大,能容納下源字符串的內容,[ ]里不能為空;
  • 目標空間必須可修改;
  • 使用需要包含頭文件<string.h>;
#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello";char arr2[] = "world";char* p = strcat(arr1, arr2);printf("%s\n", p);printf("%s\n", arr1);return 0;
}

5.2 模擬實現strcat函數

char* mystrcat(char* dest, const char* src)
{assert(dest && src);char* p = dest;while (*dest){dest++;}//找到目標字符串中的\0,明確從那里開始追加。while ((*dest++ = *src++)){;}return p;
}
int main()
{char arr1[20] = "hello";char arr2[] = "world";char* ret = mystrcat(arr1, arr2);printf("%s", ret);return 0;
}

結語:本篇文章到此結束,下一篇將會為大家呈現字符函數和字符串函數的剩余內容,如果這篇文章對你的學習有幫助的話,歡迎一起討論學習,你這么帥、這么美給個三連吧~~~

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

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

相關文章

(吃飯)質數時間

題目描述如果把一年之中的某個時間寫作 a 月 b 日 c 時 d 分 e 秒的形式&#xff0c;當這五個數都為質數時&#xff0c;我們把這樣的時間叫做質數時間&#xff0c;現已知起始時刻是 2022 年的 a 月 b 日 c 時 d 分 e 秒&#xff0c;終止時刻是 2022 年的 u 月 v 日 w 時 x 分 y…

【RK3568 RTC 驅動開發詳解】

RK3568 RTC 驅動開發詳解一、Linux RTC 子系統架構?二、設備樹配置?三、驅動四、時間相關命令實時時鐘&#xff08;RTC&#xff09;是嵌入式系統中不可或缺的硬件模塊&#xff0c;負責在系統斷電后繼續計時&#xff0c;為設備提供穩定的時間基準。本文將以瑞芯微 RK3568 平臺…

文本編碼檢測庫`chardet` 和 `uchardet`對比使用示例及注意事項

在處理未知編碼的二進制數據時&#xff0c;chardet 和 uchardet 是兩個非常實用的字符編碼自動檢測庫&#xff0c;尤其適用于從衛星通信、文件、網絡流等來源獲取的未標明編碼的文本數據。一、chardet&#xff08;Python版&#xff09; ? 簡介 chardet 是一個用 Python 編寫的…

[Windows]Postman-app官方歷史版本下載方法

Postman-app官方歷史版本下載方法最新版&歷史版本官網地址最新版本下載歷史版本下載禁止自動更新方法Postman最新版安裝后必須要登錄才能使用某些特定功能&#xff0c;多有不便&#xff0c;因此花了點時間整理了一下歷史版本如何下載的方法&#xff0c;鏈接均為官網鏈接&am…

【Spring Boot 快速入門】三、分層解耦

目錄分層解耦案例&#xff1a;將 emp.xml 中的數據解析并響應三層架構分層解耦IOC & DI 入門IOC 詳解DI 詳解分層解耦 案例&#xff1a;將 emp.xml 中的數據解析并響應 emp.xml 內容如下&#xff1a; <emps><emp><name>Tom</name><age>18…

井云科技2D交互數字人:讓智能服務觸手可及的實用方案

在如今的數字化時代&#xff0c;智能交互已成為各行業提升服務質量的重要方向。而井云 2D 交互數字人系統憑借其獨特的技術優勢&#xff0c;正逐漸成為眾多企業實現智能服務升級的優選。它無需復雜的操作和高昂的成本&#xff0c;就能讓數字人在各類線下場景中發揮重要作用&…

本地部署VMware ESXi,并實現無公網IP遠程訪問管理服務器

ESXi&#xff08;VMware ESXi&#xff09;是VMware公司推出的一款企業級虛擬化平臺&#xff0c;基于裸機&#xff08;bare-metal&#xff09;安裝的虛擬化操作系統。它可以在一臺物理服務器上運行多個虛擬機&#xff0c;廣泛應用于數據中心和云計算環境中。很多公司為了方便管理…

讓科技之光,溫暖銀齡歲月——智紳科技“智慧養老進社區”星城國際站溫情紀實

七月的風&#xff0c;帶著夏日的熱情&#xff0c;輕輕拂過邯鄲星城國際社區蔥郁的綠意。2025年7月30日&#xff0c;一個以“幸福晚景&#xff0c;樂享銀齡—智慧養老進社區”為主題的活動&#xff0c;如一股暖流&#xff0c;浸潤了社區的長者們。智紳科技懷揣著“科技賦能養老&…

Java單元測試和設計模式

單元測試 . 測試分類 什么是測試? 測試的目的是盡可能多的發現軟件中存在的BUG,而不是為了隱藏BUG。事實上測試有很多種類,比如:邊界測試,壓力測試,性能測試等 黑盒測試 黑盒測試也叫功能測試,主要關注軟件每個功能是否實現,并不關注軟件代碼是否有錯誤;測試人員…

UOS統信桌面系統解決編譯錯誤:C compiler cc is not found指南

一、系統環境 1.操作系統版本2.編譯環境 PC:~$ gcc --version gcc (Uos 8.3.0.13-deepin1) 8.3.0 Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY o…

深入理解 Docker 容器網絡:為什么用 host 網絡模式能解決連通性問題?

Docker 已經成為現代應用部署的標配&#xff0c;大家都知道它的網絡隔離做得很好&#xff0c;既安全又靈活。不過&#xff0c;在實際用 Docker 部署服務的過程中&#xff0c;相信很多人都遇到過這樣的情況&#xff1a;主機上能連通的外部服務&#xff0c;一到容器里卻死活連不上…

Spring Boot 異常處理:從全局捕獲到優化用戶體驗!

全文目錄&#xff1a;開篇語**前言****1. Spring Boot 異常處理的基本概念****2. 使用 ExceptionHandler 局部處理異常****示例&#xff1a;局部異常處理****優化建議&#xff1a;****3. 使用 ControllerAdvice 和 RestControllerAdvice 進行全局異常處理****示例&#xff1a;全…

vue3.0 + TypeScript 中使用 axios 同時進行二次封裝

項目背景是vite搭建的vue3.0 TypeScript 的項目&#xff0c;需要統一處理和統一維護就對axios進行了二次封裝 axios的安裝 npm install axios定義http文件夾然后內部定義index.ts文件&#xff0c;內部開始封裝 import axios, {type AxiosInstance} from "axios";…

ESP32- 項目應用1 音樂播放器之sd的驅動配置 #1

音樂播放器 ESP32- 項目應用1 音樂播放器之sd的驅動配置 #1 文章目錄 音樂播放器 1 sd卡介紹 1.1 SDCARD介紹 1.2 物理結構 1.3 協議說明 1.4 sd 卡模式 1.5 數據模式 1.6 sdio 初始化流程 1.7 SPI 模式下的 SD 卡初始化 2 原理圖 2.1 sd原理圖 2.2 esp32的接口 3 代碼配置 3.…

Vue.js 指令系統完全指南:深入理解 v- 指令

Vue.js 的指令系統是其最強大的特性之一&#xff0c;通過以 v- 開頭的特殊屬性&#xff0c;我們可以在模板中聲明式地綁定底層Vue實例的數據。本文將深入講解Vue中最重要的指令&#xff0c;幫助掌握Vue的核心功能。 文章目錄1. v-model&#xff1a;雙向數據綁定的核心基本用法修…

計算機分類匯總大全

前端部分有 Node.js、ActionScript、Swift、TypeScript、Webpack、JavaScript。需要分別詳細說明它們的定義、特點、應用場景、優缺點等。比如 Node.js&#xff0c;要提到它的運行環境、事件驅動、非阻塞 I/O&#xff0c;適合的應用如 API 服務、實時應用&#xff0c;以及常用框…

模擬鏈路濾波器設計一些細節

目錄 原設計思路剖析 300M帶寬仿真與計算 原設計思路剖析 濾波器設計的一些細節,以下為ADS54J60模擬鏈路的一些問題設計原理圖 實際電路設計如上所示,但是實際bom并未按此設計,根據實際的BOM明細以及ADC使用說明書,可以間接理解原設計者的設計初衷,是將ADC的一部分特性…

CatBoost 完整解析:類別特征友好的梯度提升框架

1?? 什么是 CatBoost&#xff1f;CatBoost&#xff08;Categorial Boosting&#xff09;是由 Yandex&#xff08;俄羅斯搜索引擎公司&#xff09;開源的梯度提升框架&#xff0c;專為類別特征處理優化。核心特點&#xff1a;無需手動 one-hot / LabelEncoding&#xff0c;原生…

NDBmysql-cluster集群部署腳本

NDB(Network Database)是MySQL Cluster的核心存儲引擎,專為高可用性、高吞吐量、分布式數據存儲設計,采用內存計算+磁盤持久化架構,支持跨節點數據分片與自動冗余,適用于對實時性和可靠性要求嚴苛的業務場景(如金融交易、電信計費、實時分析等)。 今天大白鼠就分享構建…

計算機網絡中的socket是什么?編程語言中的socket編程又是什么?python的socket編程又該如何用?

1. 計算機網絡中的 Socket 是什么&#xff1f; 想象一下電話系統&#xff1a; 電話插座 (Socket)&#xff1a; 是墻上的一個物理接口&#xff0c;它本身不是通話&#xff0c;但它是建立通話連接的端點。你需要把電話線插進插座才能打電話。通話 (Connection)&#xff1a; 是兩臺…