C語言 字符函數和字符串函數(1)

目錄

1.字符分類函數

2.字符轉換函數

3.strlen的使用和模擬實現

4.strcpy的使用和模擬實現


在編程的過程中,我們經常要處理字符和字符串,為了方便操作字符和字符串,C語言標準庫中提

供了一系列庫函數,接下來我們就學習一下這些函數。

1.字符分類函數

C語言中有一系列的函數是專門做字符分類的,也就是一個字符是屬于什么類型的字符的。

這些函數的使用都需要包含一個頭文件是 <ctype.h>?

這些函數的使用方法非常類似,我們就講解一個函數的實例,其他的非常類似:

int islower ( int c );

islower?是能夠判斷參數部分的 ?c??是否是小寫字母的。

通過返回值來說明是否是小寫字母,如果是小寫字母就返回非0的整數,如果不是小寫字母,則返

回0。

練習:

?寫一個代碼,將字符串中的小寫字母轉大寫,其他字符不變。

#include <stdio.h>
#include <ctype.h>
int main ()
{int i = 0;char str[] = "Test String.\n";char c;while (str[i]){c = str[i];if (islower(c))c -= 32;putchar(c);i++;}return 0;
}

代碼解釋:

1.?頭文件
- ?#include <stdio.h>? :要用 ?putchar? 輸出字符,得包含這個標準輸入輸出頭文件。
- ?#include <ctype.h>? :?islower? 函數能判斷字符是不是小寫字母,它在這個字符處理頭文件里。
2.??main? 函數
- 程序從這里開始。?int main? 表示返回整數,?return 0? 說明程序正常結束。
3.?變量
- ?int i = 0? :當索引,用來挨個訪問字符串字符。
- ?char str[] = "Test String.\n"? :存要處理的字符串。
- ?char c? :臨時存從字符串取出的字符。
4.?循環處理
- ?while (str[i])? :只要字符不是結束符 ?'\0'? ,就循環。
- ?c = str[i]? :拿出當前字符放 ?c? 里。
- ?if (islower(c))? :判斷 ?c? 是不是小寫字母,是就執行下面。
- ?c -= 32? :小寫字母ASCII碼減32 ,變成大寫字母。
- ?putchar(c)? :把處理后的字符打印出來。
- ?i++? :準備處理下一個字符。

2.字符轉換函數

C語言提供了2個字符轉換函數:

int tolower ( int c ); //將參數傳進去的大寫字母轉小寫
int toupper ( int c ); //將參數傳進去的小寫字母轉大寫

上面的代碼,我們將小寫轉大寫,是-32完成的效果,有了轉換函數,就可以直接使用 tolower ?函

數。

#include <stdio.h>
#include <ctype.h>
int main ()
{int i = 0;char str[] = "Test String.\n";char c;while (str[i]){c = str[i];if (islower(c))c = toupper(c);putchar(c);i++;}return 0;
}

代碼解釋:

1.?功能:把字符串里的小寫字母轉成大寫并輸出。
2.?頭文件:
- ?stdio.h?:用 ?putchar? 打印字符。
- ?ctype.h?:用 ?islower? 查小寫字母,?toupper? 轉大寫。
3.?變量:
- ?i?:當“指針”,逐個訪問字符串字符。
- ?str?:存要處理的字符串(比如 ?"Test String.\n"?)。
- ?c?:臨時存當前字符。
4.?過程:
- 逐個字符檢查,是小寫字母就轉大寫,然后打印。
- 直到遇到字符串結尾的 ?\0? 才停止。

3.strlen的使用和模擬實現

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

代碼解釋:

1.?功能:比較兩個字符串的長度并輸出結果。
2.?頭文件:
- ?stdio.h?:用于輸入輸出(?printf?)。
- ?string.h?:用于使用字符串長度函數 ?strlen?。
3.?變量:
- ?str1? 指向字符串 ?"abcdef"?(長度6)。
- ?str2? 指向字符串 ?"bbb"?(長度3)。
4.?邏輯:
- 計算 ?str2? 長度減 ?str1? 長度:?3-6 = -3?。
- 由于 ?-3? 不大于0,輸出 ?"srt1>str2"?(注意代碼中 ?srt1? 是拼寫錯誤,應為 ?str1?)。

strlen的模擬實現:
?
方式1:

//計數器方式
int my_strlen(const char * str)
{int count = 0;assert(str);while(*str){count++;str++;}return count;
}

代碼解釋:

1.?函數功能:這個函數?my_strlen 用來計算傳入字符串的長度,類似C語言標準庫函數 ?strlen。
2.?參數?const char * str? 表示傳入一個指向字符常量的指針,即傳入字符串的首地址,?const? 修飾意味著函數內不能通過這個指針修改字符串內容。
3.?變量?int count=0;定義一個整型變量?count 作為計數器,初始化為?0?,用來統計字符串字符個數。
4.?斷言?assert(str);?是一個斷言宏,作用是在程序運行時檢查?str 指針是否為空。如果?str 為空,程序會終止并報錯,這能防止后續空指針解引用導致的程序崩潰。
5.?循環計數:
- ?while(*str):只要當前指針指向的字符(?*str )不是字符串結束符 '\0' ,就執行循環體。
- ?count++;:每循環一次,計數器 ?count? 加 ?1? ,統計字符數量。
- ?str++;:將指針向后移動一位,指向下一個字符,以便繼續檢查后續字符。
6.?返回值:return count;當循環結束,說明已經遍歷完字符串,此時返回計數器?count 的值,也就是字符串的長度(不包含結束符'\0')。

4.strcpy的模擬和使用

char* strcpy(char * destination, const char * source );
  • - 源字符串必須以 ?'\0'??結束。
  • - 會將源字符串中的 ?'\0'??拷貝到目標空間。
  • - 目標空間必須足夠大,以確保能存放源字符串。
  • - 目標空間必須可修改。
  • - 學會模擬實現。
#include <stdio.h>
#include <string.h>int main() {char source[] = "Hello, world!";  // 源字符串char destination[20];  // 目標字符串數組,空間要足夠容納源字符串// 使用strcpy函數將源字符串拷貝到目標字符串strcpy(destination, source); printf("拷貝后的字符串: %s\n", destination);return 0;
}

代碼解釋:

1.?頭文件引入
- ?#include<stdio.h>:用于使用輸入輸出函數,如printf。
- ?#include<string.h>: strcpy?函數的聲明在這個頭文件中,所以要引入。
2.?定義字符串
- ?char source[] = "Hello, world!"; : 定義并初始化源字符串。
- ?char destination[20];? :定義目標字符串數組,這里大小設為?20 ,確保能容納源字符串(包括結束符'\0')。
3.?使用strcpy函數strcpy(destination, source); : 將源字符串source拷貝到目標字符串destination,包括字符串結束符'\0'。
4.?輸出結果printf("拷貝后的字符串: %s\n", destination); : 使用printf函數輸出拷貝后的目標字符串。

本篇內容先到這里,像這種函數還有多個,接下來再為大家一一顯示,希望大家能深入理解,感謝

大家的觀看!

?

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

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

相關文章

MySQL 中如何進行 SQL 調優?

在MySQL中進行SQL調優是一個系統性工程&#xff0c;需結合索引優化、查詢改寫、性能分析工具、數據庫設計及硬件配置等多方面策略。以下是具體優化方法及案例說明&#xff1a; 一、索引優化&#xff1a;精準提速的關鍵 索引類型選擇 普通索引&#xff1a;加速頻繁查詢的列&…

OpenCV圖像金字塔詳解:原理、實現與應用

一、什么是圖像金字塔&#xff1f; 圖像金字塔是圖像處理中一種重要的多尺度表示方法&#xff0c;它通過對圖像進行重復的平滑和降采樣&#xff08;或上采樣&#xff09;操作&#xff0c;生成一系列分辨率逐漸降低&#xff08;或升高&#xff09;的圖像集合。這種結構形似金字…

收集飛花令碎片——C語言分支與循環語句(上)

前言 Hello,各位碼友&#xff0c;本章將會給大家帶來C語言的分支與循環整章串講&#xff0c;這一張的內容分為基礎知識和程序練習兩個部分 希望通過這一章能夠帶大家更好地去掌握C語言的分支與循環語句 大家一起努力吧 C語言分支與循環語句&#xff08;基礎知識&#xff09; C…

嵌入式硬件篇---TOF|PID

文章目錄 前言1. 硬件準備主控芯片ToF模塊1.VL53L0X2.TFmini 執行機構&#xff1a;電機舵機其他 2. 硬件連接(1) VL53L0X&#xff08;IC接口&#xff09;(2) TFmini&#xff08;串口通信&#xff09; 3. ToF模塊初始化與數據讀取(1) VL53L0X&#xff08;基于HAL庫&#xff09;(…

PCB設計實踐(十二)PCB設計電容選型:功能、材質、規則

在PCB設計中&#xff0c;電容作為基礎元件承擔著濾波、儲能、去耦、耦合等核心功能。其分類與使用規則直接影響電路穩定性、抗干擾能力和信號完整性。本文從工程實踐角度系統梳理PCB設計中電容的五大分類、選型規范及布局布線規則&#xff0c;幫助設計者構建科學的電容應用體系…

vue2關閉eslint

在項目根目錄下找到 vue.config.js 文件。如果沒有該文件&#xff0c;可以直接在項目根目錄創建一個。 2. 添加 lintOnSave: false 配置 module.exports {lintOnSave: false };

MyBatis 一對多關聯映射在Spring Boot中的XML配置

在Spring Boot中使用MyBatis實現一對多關系時&#xff0c;可以通過XML映射文件來配置。下面我將詳細介紹幾種實現方式。 基本概念 一對多關系指的是一個實體對象包含多個子對象集合的情況&#xff0c;例如&#xff1a; 一個部門有多個員工一個訂單有多個訂單項一個博客有多個…

基于Stable Diffusion XL模型進行文本生成圖像的訓練

基于Stable Diffusion XL模型進行文本生成圖像的訓練 flyfish export MODEL_NAME"stabilityai/stable-diffusion-xl-base-1.0" export VAE_NAME"madebyollin/sdxl-vae-fp16-fix" export DATASET_NAME"lambdalabs/naruto-blip-captions"acceler…

基于React的高德地圖api教程001:初始化地圖

文章目錄 1、初始化地圖1.1 創建react項目1.2 可視化地圖1.3 設置衛星地圖1.4 添加開關開啟3D地圖1.5 代碼下載1、初始化地圖 1.1 創建react項目 創建geodeapi項目: npx create-react-app gaodeapi安裝高德地圖包: npm install @amap/amap-jsapi-loader1.2 可視化地圖 在…

uniapp使用npm下載

uniapp的項目在使用HBuilder X創建時是不會有node_modules文件夾的&#xff0c;如下圖所示&#xff1a; 但是uni-app不管基于哪個框架&#xff0c;它內部一定是有node.js的&#xff0c;否則沒有辦法去實現框架層面的一些東西&#xff0c;只是說它略微有點差異。具體差異表現在…

輕量在線工具箱系統源碼 附教程

源碼介紹 輕量在線工具箱系統源碼,直接扔服務器 修改config/config.php文件里面的數據庫 后臺賬號admin 密碼admin123 本工具是AI寫的 所以工具均是第三方接口直接寫的。 需要加工具直接自己找接口寫好扔到goju目錄 后臺自動讀取 效果預覽 源碼獲取 輕量在線工具箱系統源…

圖解gpt之Seq2Seq架構與序列到序列模型

今天深入探討如何構建更強大的序列到序列模型&#xff0c;特別是Seq2Seq架構。序列到序列模型&#xff0c;顧名思義&#xff0c;它的核心任務就是將一個序列映射到另一個序列。這個序列可以是文本&#xff0c;也可以是其他符號序列。最早&#xff0c;人們嘗試用一個單一的RNN來…

mac M2能安裝的虛擬機和linux系統系統

能適配MAC M2芯片的虛擬機下Linux系統的搭建全是深坑&#xff0c;目前網上的資料能搜到的都是錯誤的&#xff0c;自己整理并分享給坑友們~ 網上搜索到的推薦安裝的改造過的centos7也無法進行yum操作&#xff0c;我這邊建議安裝centos8 VMware Fusion下載地址&#xff1a; htt…

「國產嵌入式仿真平臺:高精度虛實融合如何終結Proteus時代?」——從教學實驗到低空經濟,揭秘新一代AI賦能的產業級教學工具

引言&#xff1a;從Proteus到國產平臺的范式革新 在高校嵌入式實驗教學中&#xff0c;仿真工具的選擇直接影響學生的工程能力培養與創新思維發展。長期以來&#xff0c;Proteus作為經典工具占據主導地位&#xff0c;但其設計理念已難以滿足現代復雜系統教學與國產化技術需求。…

【Linux】在Arm服務器源碼編譯onnxruntime-gpu的whl

服務器信息&#xff1a; aarch64架構 ubuntu20.04 nvidia T4卡 編譯onnxruntime-gpu前置條件&#xff1a; 已經安裝合適的cuda已經安裝合適的cudnn已經安裝合適的cmake 源碼編譯onnxruntime-gpu的步驟 1. 下載源碼 git clone --recursive https://github.com/microsoft/o…

前端上傳el-upload、原生input本地文件pdf格式(純前端預覽本地文件不走后端接口)

前端實現本地文件上傳與預覽&#xff08;PDF格式展示&#xff09;不走后端接口 實現步驟 第一步&#xff1a;文件選擇 使用前端原生input上傳本地文件&#xff0c;或者是el-upload組件實現文件選擇功能&#xff0c;核心在于文件渲染處理。&#xff08;input只不過可以自定義樣…

Python 數據分析與可視化:開啟數據洞察之旅(5/10)

一、Python 數據分析與可視化簡介 在當今數字化時代&#xff0c;數據就像一座蘊藏無限價值的寶藏&#xff0c;等待著我們去挖掘和探索。而 Python&#xff0c;作為數據科學領域的明星語言&#xff0c;憑借其豐富的庫和強大的功能&#xff0c;成為了開啟這座寶藏的關鍵鑰匙&…

C語言學習記錄——深入理解指針(4)

OK&#xff0c;這一篇主要是講我學習的3種指針類型。 正文開始&#xff1a; 一.字符指針 所謂字符指針&#xff0c;顧名思義就是指向字符的指針。一般寫作 " char* " 直接來說說它的使用方法吧&#xff1a; &#xff08;1&#xff09;一般使用情況&#xff1a; i…

springboot3+vue3融合項目實戰-大事件文章管理系統獲取用戶詳細信息-ThreadLocal優化

一句話本質 為每個線程創建獨立的變量副本&#xff0c;實現多線程環境下數據的安全隔離&#xff08;線程操作自己的副本&#xff0c;互不影響&#xff09;。 關鍵解讀&#xff1a; 核心機制 ? 同一個 ThreadLocal 對象&#xff08;如示意圖中的紅色區域 tl&#xff09;被多個線…

Nacos源碼—8.Nacos升級gRPC分析六

大綱 7.服務端對服務實例進行健康檢查 8.服務下線如何注銷注冊表和客戶端等信息 9.事件驅動架構源碼分析 一.處理ClientChangedEvent事件 也就是同步數據到集群節點&#xff1a; public class DistroClientDataProcessor extends SmartSubscriber implements DistroDataSt…