1. 基本介紹
在程序設(shè)計中,字符串操作是必不可缺的,無論是工程設(shè)計還是算法設(shè)計均離不開字符串,字符串是由一個個單獨的字符構(gòu)成的串,其數(shù)據(jù)結(jié)構(gòu)是線性的,常以ASCII碼表示,同時只要設(shè)定得當(dāng),其展示任何一種編碼也都是可以的。
字符串有很多的操作,也有非常多的擴展算法,本文從設(shè)計的角度介紹這些基本的字符串操作以及其實現(xiàn)代碼,本文實現(xiàn)的大多數(shù)代碼諸如C和C++中的頭文件<string.h>(C++則是<cstring>)已經(jīng)封裝好了相應(yīng)的函數(shù)和方法可以直接使用。
2. 獲取字符串長度
顧名思義,指獲取一個字符串的長度,在C語言中我們可以直接用strlen(str)來表示,其實現(xiàn)思路可以直接使用一個循環(huán),對每一個字符進行計數(shù),當(dāng)循環(huán)遇到字符’\0’即結(jié)束符時循環(huán)結(jié)束,返回這個循環(huán),示例代碼如下:
#include<stdio.h> int _strlen(char str[]){ int i=0; for(i=0;str[i]!='\0';i++){} return i; } int main(){ char *str = "Hello My DotCpp.com"; int len = _strlen(str); printf("%d",len); return 0; }
輸出19
3. 字符位置獲取
給定一個字符,獲取這個字符串中首次出現(xiàn)這個字符的位置,如果沒有找到則給與一個錯誤信號,如給定一個hello,要求找出l的位置,那么將會找到位置3 ,C語言中可以使用strchr(str,c)表示,實現(xiàn)示例代碼如下:
#include<stdio.h> int _charAt(char str[],char c){ int i=0; for(i=0;str[i]!='\0'&&str[i]!=c;i++){} return i; } int main(){ char *str = "Hello My DotCpp.com"; int way = _charAt(str,'l'); printf("%d",way); return 0; }
輸出3
擴展練習(xí):如果需要你創(chuàng)建一個函數(shù),獲取這個字符串中所有出現(xiàn)這個字符的位置,又該如何去設(shè)計呢?
4. 拆分子串操作substr
顧名思義,substr對一個字符串進行拆分,也可以稱之為對一個字符串的某一段進行截取,如一個字符串的長度有0~n,改操作就是取其中i~j的位置,使其重新生成一個新的字符串,獲取的就是這個字符串,在C語言中沒有相關(guān)的操作,在不同的教程中這樣的操作也有不同的命名,本文將此操作命名未substr(在某些別的資料中substr操作則為查找操作),本實現(xiàn)示例代碼如下(注意拆分時需要補充結(jié)束符’\0’):
#include<stdio.h> char *_substr(char str[],int i,int j){ int pos=0; char *backup; while(i<j){ backup[pos++] = str[i++]; } backup[pos]='\0'; return backup; } int main(){ char *str = "Hello My DotCpp.com"; char *newstr = _substr(str,0,5); printf("%s",newstr); return 0; }
輸出Hello
5. 拆分子串操作prefix
如同上文的操作,截取操作變?yōu)榱酥唤厝∽址那癿個字符,組成一個全新的字符串,本實現(xiàn)示例代碼如下(注意拆分時需要補充結(jié)束符’\0’):。
#include<stdio.h> char *_prefix(char str[],int m){ int pos=0,i; char *backup; for(i=0 ;i<m ;i++){ backup[pos++] = str[i]; } backup[pos]='\0'; return backup; } int main(){ char *str = "Hello My DotCpp.com"; char *newstr = _prefix(str,5); printf("%s",newstr); return 0; }
輸出Hello
6. 拆分子串操作suffix
如同上文的操作,截取操作變?yōu)榱酥唤厝∽址暮髆個字符,組成一個全新的字符串,本實現(xiàn)示例代碼如下(注意拆分時需要補充結(jié)束符’\0’):
這里需要稍微注意一下,在創(chuàng)建字符串的時候,由于各種標(biāo)準(zhǔn)的C對語法的支持不太一樣,這里采用較為舊的方式實現(xiàn),即直接分配一個相應(yīng)的內(nèi)存空間,這與上面的做法稍微不同,如果采用char *backup的創(chuàng)建方式,將會產(chǎn)生內(nèi)存錯誤問題,這個問題原理較為晦澀,有能力的同學(xué)可以參考資料自行理解,這里為了避免沖突簡化了操作。
#include<stdio.h> char *_suffix(char str[],int m){ int len=0; for(;str[len]!='\0';len++){} //獲取字符串總長度(避免使用其他封裝函數(shù),自行設(shè)計時可以使用strlen替代) printf("%d\n",len-m); int pos=0,i; char backup[500]; for(i=len-m ;i<len ;i++){ backup[pos++] = str[i]; } backup[pos]='\0'; return backup; } int main(){ char *str = "Hello My DotCpp.com"; char *newstr = _suffix(str,3); printf("%s",newstr); return 0; }
輸出com
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導(dǎo)課程