C語(yǔ)言字符函數(shù)與字符串函數(shù)的實(shí)現(xiàn)示例
1. 字符函數(shù)
在C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中提供了一系列用于處理字符的函數(shù),這些函數(shù)定義在 <ctype.h>頭文件中。
字符函數(shù)分為兩種:字符分類(lèi)函數(shù)和字符轉(zhuǎn)換函數(shù)
1.1 字符分類(lèi)函數(shù)
C語(yǔ)?中有?系列的函數(shù)是專(zhuān)?做字符分類(lèi)的,也就是?個(gè)字符是屬于什么類(lèi)型的字符。
例如:islower函數(shù)是判斷參數(shù)部分是否為小寫(xiě)字母,如果是小寫(xiě)字母就返回非0的數(shù)字,如果不是小寫(xiě)字母就返回0
#include<stdio.h> #include<ctype.h> int main() { char c = 'A'; int ret = islower(c); printf("%d", ret); return 0; }
運(yùn)行結(jié)果:
練習(xí):寫(xiě)?個(gè)代碼,將字符串中的?寫(xiě)字?轉(zhuǎn)?寫(xiě),其他字符不變。
#include<stdio.h> #include<ctype.h> int main() { char str[] = "hello world"; int i = 0; while (str[i]) { if (islower(str[i])) { str[i] = str[i] - 32; } i++; } printf("%s", str); return 0; }
運(yùn)行結(jié)果:
對(duì)于剩余的字符分類(lèi)函數(shù),大家可以手動(dòng)進(jìn)行嘗試一下,這里就不在進(jìn)行詳細(xì)介紹啦
1.2 字符轉(zhuǎn)換函數(shù)
C語(yǔ)?提供了2個(gè)字符轉(zhuǎn)換函數(shù):
tolower ( c ); //將參數(shù)傳進(jìn)去的?寫(xiě)字?轉(zhuǎn)?寫(xiě) toupper ( c ); //將參數(shù)傳進(jìn)去的?寫(xiě)字?轉(zhuǎn)?寫(xiě)
tolower函數(shù)示例:
#include<stdio.h> #include<ctype.h> int main() { char c=tolower('A'); printf("%c", c); return 0; }
toupper函數(shù)示例:
#include<stdio.h> #include<ctype.h> int main() { char c=toupper('a'); printf("%c", c); return 0; }
學(xué)習(xí)完字符轉(zhuǎn)換函數(shù)后,我們將上面練習(xí)的代碼進(jìn)行改造一下:
int main() { char str[] = "hello world"; int i = 0; while (str[i]) { if (islower(str[i])) { str[i] = toupper(str[i]); } i++; } printf("%s", str); return 0; }
上?的代碼,我們將?寫(xiě)轉(zhuǎn)?寫(xiě),是-32完成的效果,有了轉(zhuǎn)換函數(shù),就可以直接使? tolowe函數(shù)。
2. 字符串函數(shù)
在C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的<string.h>頭文件中提供了一系列用于處理字符串的函數(shù),這些函數(shù)用于字符串的復(fù)制、連接、比較、搜索、分割等操作。
下面介紹一些C語(yǔ)言中常用的字符串函數(shù)
2.1 strlen 函數(shù)
strlen函數(shù)是用來(lái)計(jì)算參數(shù)(字符串)長(zhǎng)度的(不包括終止的空字符 \0 )
strlen函數(shù)的注意事項(xiàng):
- 字符串以 '\0' 作為結(jié)束標(biāo)志,strlen函數(shù)返回的是在字符串中 '\0' 前?出現(xiàn)的字符個(gè)數(shù)(不包 含 '\0' )。
- 參數(shù)指向的字符串必須要以 '\0' 結(jié)束。
- 注意函數(shù)的返回值為 size_t,是?符號(hào)的( 易錯(cuò) )
- strlen的使?需要包含頭?件
strlen函數(shù)的使用:
注意這里的初始化方式會(huì)在 str字符數(shù)組默認(rèn)最后加上一個(gè) \0,如果用另一種初始化方式會(huì)出現(xiàn)什么現(xiàn)象呢?
為什么這里計(jì)算str字符數(shù)組的長(zhǎng)度是74呢?因?yàn)檫@里的初始化方式是不會(huì)自動(dòng)補(bǔ)上 \0,所以strlen函數(shù)會(huì)根據(jù)地址一直往后找,直到找到 \0,所以這里的 74 實(shí)際上是一個(gè)隨機(jī)值。
此時(shí)我們?cè)跀?shù)組的末尾加上 \0 這時(shí)候strlen函數(shù)計(jì)算的結(jié)果就是 \0前面的字符個(gè)數(shù)。
2.2 strcpy 函數(shù)
strcpy函數(shù)會(huì)將源指向的字符串復(fù)制到目標(biāo)指向的數(shù)組中,包括終止的空字符(并在該點(diǎn)停止)
strcpy函數(shù)的注意事項(xiàng):
- destination指向字符串復(fù)制到的數(shù)組,source指向要復(fù)制的字符串
- 源字符串必須以 '\0' 結(jié)束。
- 會(huì)將源字符串中的 '\0' 拷?到?標(biāo)空間。
- ?標(biāo)空間必須?夠?,以確保能存放源字符串。(否則會(huì)出現(xiàn)棧幀空間溢出的現(xiàn)象)
- ?標(biāo)空間必須可修改。
例如:
2.3 strcat 函數(shù)
strcat函數(shù)是將字符串source連接到destination的末尾(包括終止的空字符 \0)
strcat函數(shù)的注意事項(xiàng):
- 源字符串必須以 '\0' 結(jié)束。
- ?標(biāo)字符串中也得有 \0 ,否則沒(méi)辦法知道追加從哪?開(kāi)始。
- ?標(biāo)空間必須有?夠的?,能容納下源字符串的內(nèi)容。
- ?標(biāo)空間必須可修改。
例如:
注意這里被追加的目標(biāo)空間必須保證足夠大,否則也會(huì)出現(xiàn)棧幀空間溢出的現(xiàn)象
那么strcat函數(shù)是否可以自己追加自己呢?其實(shí)是可以的,但是一般不會(huì)這樣使用,使用不當(dāng)很容易造成死循環(huán)的問(wèn)題 ,對(duì)于自己追加自己,我們一般使用strncat函數(shù),在下面我們將會(huì)了解到strncat函數(shù)。
2.4 strcmp 函數(shù)
strcmp函數(shù)是用于兩個(gè)字符串進(jìn)行比較的
- 如果第?個(gè)字符串?于第?個(gè)字符串,則返回?于0的數(shù)字
- 如果第?個(gè)字符串等于第?個(gè)字符串,則返回0
- 如果第?個(gè)字符串?于第?個(gè)字符串,則返回?于0的數(shù)字
例如:
2.5 strncpy 函數(shù)
strncpy和strcpy是非常相似的,strncpy在參數(shù)部分加上了復(fù)制的字節(jié)個(gè)數(shù)(size_t num)
用法與strcpy也是一模一樣的,只是這時(shí)候可以由我們操控復(fù)制多少個(gè)字節(jié)(num)到目標(biāo)位置。
例如:
注意:如果源字符串的?度?于num,則拷?完源字符串之后,在?標(biāo)的后邊追加0,直到num個(gè)。
2.6 strncat 函數(shù)
對(duì)比strcat函數(shù),strncat函數(shù)在參數(shù)部分也多了一個(gè)(size_t num)追加的字節(jié)個(gè)數(shù)
例如:
這時(shí)候就可以自己操控自己想要追加的內(nèi)容了
注意:如果source 指向的字符串的?度?于num的時(shí)候,只會(huì)將字符串中到 \0 的內(nèi)容追加到destination指向的字符串末尾
例如:
2.7 strncmp 函數(shù)
對(duì)比strcmp函數(shù),strncmp函數(shù)在參數(shù)部分也多了一個(gè)(size_t num)比較的字節(jié)個(gè)數(shù)
?較str1和str2的前num個(gè)字符,如果相等就繼續(xù)往后?較,最多?較num個(gè)字?,如果提前發(fā)現(xiàn)不? 樣,就提前結(jié)束,?的字符所在的字符串?于另外?個(gè)。如果num個(gè)字符都相等,就是相等返回0
例如:
此時(shí)只是比較的str1和str2中的前3個(gè)字符,前三個(gè)字符相等所以返回值為0
2.8 strstr 函數(shù)
strstr函數(shù)的作用是在一個(gè)字符串(str1)中查找第一次出現(xiàn)的子字符串(str2),并返回指向該子字符串的指針,如果沒(méi)有找到子字符串,則返回NULL(空指針)
例如:
結(jié)語(yǔ)
以上就是C語(yǔ)言中常見(jiàn)的字符函數(shù)以及字符串函數(shù),到此這篇關(guān)于C語(yǔ)言字符函數(shù)與字符串函數(shù)的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)C語(yǔ)言字符函數(shù)與字符串函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入淺出理解C語(yǔ)言初識(shí)結(jié)構(gòu)體
C?數(shù)組允許定義可存儲(chǔ)相同類(lèi)型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是?C?編程中另一種用戶(hù)自定義的可用的數(shù)據(jù)類(lèi)型,它允許你存儲(chǔ)不同類(lèi)型的數(shù)據(jù)項(xiàng),本篇讓我們來(lái)了解C?的結(jié)構(gòu)體2022-02-02QT TCP實(shí)現(xiàn)簡(jiǎn)單的通信示例
這篇文章主要為大家詳細(xì)介紹了QT TCP簡(jiǎn)單的通信示例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08QT調(diào)用vs2019生成的c++動(dòng)態(tài)庫(kù)的方法實(shí)現(xiàn)
本文主要介紹了QT調(diào)用vs2019生成的c++動(dòng)態(tài)庫(kù)的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06C語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲的示例代碼
猜數(shù)字小游戲是我們小時(shí)候喜歡我們一個(gè)經(jīng)典小游戲。這篇文章將利用C語(yǔ)言中的循環(huán)語(yǔ)句、分支語(yǔ)句和函數(shù)實(shí)現(xiàn)這一游戲,需要的可以參考一下2022-10-10C++實(shí)現(xiàn)拓?fù)渑判颍ˋOV網(wǎng)絡(luò))
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)拓?fù)渑判?,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04C++超詳細(xì)講解RTTI和cast運(yùn)算符的使用
RTTI(Runtime Type Identification)是“運(yùn)行時(shí)類(lèi)型識(shí)別”的意思。C++引入這個(gè)機(jī)制是為了讓程序在運(yùn)行時(shí)能根據(jù)基類(lèi)的指針或引用來(lái)獲得該指針或引用所指的對(duì)象的實(shí)際類(lèi)型,cast強(qiáng)制轉(zhuǎn)換運(yùn)算符是一種特殊的運(yùn)算符,它把一種數(shù)據(jù)類(lèi)型轉(zhuǎn)換為另一種數(shù)據(jù)類(lèi)型2022-08-08基于atoi()與itoa()函數(shù)的內(nèi)部實(shí)現(xiàn)方法詳解
本篇文章是對(duì)atoi()與itoa()函數(shù)的內(nèi)部實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05