C語(yǔ)言字符串函數(shù)入門(mén)
實(shí)現(xiàn)字符串庫(kù)函數(shù)功能
有些時(shí)候我們可能會(huì)被限制無(wú)法使用庫(kù)函數(shù),這個(gè)時(shí)候我們需要編寫(xiě)自己的庫(kù)函數(shù)。但了解了字符串庫(kù)函數(shù)的功能之后,想要實(shí)現(xiàn)并不困難,今天我們用數(shù)組和循環(huán)來(lái)簡(jiǎn)單實(shí)現(xiàn)幾個(gè)字符串庫(kù)函數(shù)的功能。
1.strlen函數(shù)
strlen函數(shù)使用來(lái)求字符串長(zhǎng)度的,遇到\0就會(huì)停止,并返回字符串的長(zhǎng)度,接下來(lái)根據(jù)這個(gè)特性來(lái)編寫(xiě)一下我們自己的strlen
int my_strlen(char string[]) {
int count= 0;
while (string[count] != NULL) {
count++;
}
return count;
}//也可以將while的判斷條件改為string[count]有些小伙伴應(yīng)該知道遞歸的實(shí)現(xiàn),但是這里涉及了指針的內(nèi)容,我就不教大家實(shí)現(xiàn)了
2.strcmp函數(shù)
strcmp字符串比較函數(shù),對(duì)兩個(gè)字符串進(jìn)行比較,相當(dāng)返回0,前一個(gè)字符串大于后一個(gè)字符串會(huì)返回大于0的數(shù),小于則返回小于0的數(shù),至于具體返回多少,則需要看編譯器。
在實(shí)現(xiàn)strcmp功能之前,我們需要了解它的機(jī)制,strcmp是一個(gè)字符一個(gè)字符的比較ASCII值的
int my_strcmp(char string1[], char string2[]) {
int i = 0;
//當(dāng)兩個(gè)字符串都沒(méi)有達(dá)到末端時(shí),繼續(xù)比較
while ((string1[i] == string2[i]) && string1[i] && string2[i])
i++;
return string1[i] - string2[i]; //當(dāng)兩個(gè)字符串指向的字符不一樣或者到達(dá)終點(diǎn)時(shí)返回差值
}一個(gè)簡(jiǎn)單的while循環(huán)就能達(dá)到目的
3.strcpy函數(shù)
字符串拷貝函數(shù),將后一個(gè)字符串拷貝到前一個(gè)字符串中,我們需要保證目的地足夠大
void my_strcpy(char string1[50], char string2[]) {
int i = 0;
while (string1[i++] = string2[i++]);
}
//這里利用了賦值表達(dá)式的特性,直接進(jìn)行賦值,當(dāng)string[i]為\0時(shí)賦值完循環(huán)自動(dòng)停止
//當(dāng)然這個(gè)程序并不是完美的,根據(jù)strcpy的返回值我們還可以這樣修改
char* my_strcpy(char string1[50], char string2[]) {
int i = 0;
while (string1[i++] = string2[i++]);
return string1;
}//返回目的地的起始地址4.strcat函數(shù)
strcat字符串追加,在一個(gè)字符串之后追加一個(gè)新的字符串,如果以strcpy的角度理解就是以第一個(gè)字符串的\0位置為起始地址進(jìn)行字符串拷貝,那么接下來(lái)就很簡(jiǎn)單了
char* my_strcat(char string1[50], char string2[]) {
int i = -1;
while (string1[++i]);//循環(huán)停止時(shí)i指向\0
int j = 0;
while (string1[i++] = string2[j++]); //與strcpy同理
return string1;
}5.strupr函數(shù)
strupr字符串大寫(xiě)函數(shù),將所有字符串中的小寫(xiě)字母都變成大寫(xiě),我們只需要根據(jù)ASCII值就可以簡(jiǎn)單實(shí)現(xiàn)
char*my_strupr(char string[]) {
int i = 0;
while (string[i]) { //當(dāng)string[i]指向\0時(shí)循環(huán)停止
if (string[i] >= 'a' && string[i] <= 'z')
string[i] -= 32;
i++;
}
return string;
}6.strlwr函數(shù)
和strupr對(duì)應(yīng),這是字符串小寫(xiě)函數(shù),把大寫(xiě)轉(zhuǎn)成小寫(xiě),只需要對(duì)上面的代碼簡(jiǎn)單一改就可以
char*my_strlwr(char string[]) {
int i = 0;
while (string[i]) { //當(dāng)string[i]指向\0時(shí)循環(huán)停止
if (string[i] >= 'A' && string[i] <= 'Z')
string[i] += 32;
i++;
}
return string;
}總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++中set/multiset容器詳解(附測(cè)試用例與結(jié)果圖)
set/multiset屬于關(guān)聯(lián)式容器,底層結(jié)構(gòu)是用二叉樹(shù)實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于C++中set/multiset容器的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
C/C++讀寫(xiě)注冊(cè)表中二進(jìn)制數(shù)據(jù)(代碼示例)
這篇文章主要介紹了使用Windows API 函數(shù)中的RegOpenKeyEx()函數(shù)和RegSetValueEx()函數(shù)來(lái)實(shí)現(xiàn)對(duì)注冊(cè)表某項(xiàng)寫(xiě)入二進(jìn)制鍵值,需要的朋友可以參考下2020-02-02
GCC 編譯使用動(dòng)態(tài)鏈接庫(kù)和靜態(tài)鏈接庫(kù)的方法
根據(jù)鏈接時(shí)期的不同,庫(kù)又有靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)之分,有別于靜態(tài)庫(kù),動(dòng)態(tài)庫(kù)的鏈接是在程序執(zhí)行的時(shí)候被鏈接的2013-03-03
C語(yǔ)言詳解strcmp函數(shù)的分析及實(shí)現(xiàn)
strcmp函數(shù)語(yǔ)法為“int strcmp(char *str1,char *str2)”,其作用是比較字符串str1和str2是否相同,如果相同則返回0,如果不同,前者大于后者則返回1,否則返回-12022-05-05

