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