1.字符串連接操作
顧名思義,即將一個字符串鏈接到另一個字符串的尾部,我們可以創(chuàng)建一個函數(shù),同時利用指針,分別先后全部遍歷兩個字符串,將其中一個字符串的結(jié)束符’\0’去除并鏈接另一個字符串直到遇到結(jié)束符’\0’即可,函數(shù)實現(xiàn)為:
#include<stdio.h> char *_strcat(char dest[],char src[]){ char * ret = dest; while(*dest!='\0'){dest++;} //將src內(nèi)容復(fù)制在dest之后 while(*src){ *dest++ = *src++; } //在dest后面追加\0 *dest = '\0'; return ret; } int main(){ char str[] = "Hello My DotCpp.com"; char fixstr[] = "Welcome "; _strcat(fixstr,str); printf("%s",fixstr); return 0; }
輸出Welcome Hello My DotCpp.com
2. 字符串比較操作
顧名思義,對兩個字符字符字符串進(jìn)行比較,常用于確認(rèn)兩字符串是否完全相等,部分高級用法可以擴(kuò)展到利用大小差別進(jìn)行容器的算法設(shè)計等,比較操作的內(nèi)容就是對兩個字符串進(jìn)行比較,兩個字符串完全相等時返回0,第一個字符串大于第二個字符串時返回一個正值,否則返回負(fù)值,實現(xiàn)代碼為:
注意比較的時候要使用unsigned char而不要直接使用char,那是因為計算機(jī)編程語言中擴(kuò)展了char的字符位,使字符位也擁有了含義,因此建議在核心的比較時使用unsigned char的類型。
#include<stdio.h> int _strcmp (char * src, char * dst) { int ret = 0 ; while( !(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst) //兩個內(nèi)容相減,完全相等則會得到值 0,取反即為相等 ++src, ++dst; if ( ret < 0 ) ret = -1 ; else if ( ret > 0 ) ret = 1 ; return ret; } int main(){ char str[] = "Hello My DotCpp.com"; char fixstr[] = "Welcome "; int ans = _strcmp(fixstr,str); printf("%d",ans); return 0; }
輸出 1
3. 暴力匹配法
這并不是最理想的算法,但卻這是字符串匹配算法中最容易理解的算法,算法核心為給定一個主串T和一個模式串P,求問是否P是屬于T的一個字串,如:”Hello”中”llo”就是其中的一個字串,對于暴力匹配算法而言,我們可以利用兩層循環(huán)進(jìn)行比對,第一層循環(huán)中找尋T字符串中的每一個字符,第二層循環(huán)找尋的是每一個P字符,進(jìn)入第二層循環(huán)時T字符串也會跟著進(jìn)行字符前進(jìn),如果發(fā)生不匹配則產(chǎn)生一個回溯回到第一層循環(huán)的進(jìn)入字符的下一個字符。
代碼示例如下:
#include<iostream> #include<cstring> using namespace std; bool isBF(char str1[],char str2[]){ bool flag=false; int len1 = strlen(str1); int len2 = strlen(str2); for(int i=0;i<len1;i++){ for(int j=0;j<len2;j++){ int pos=i; if( str1[pos++] != str2[j]){ break; }else{ if(j=len2-1) flag=true; } } } return flag; } int main(){ char str1[] = "HI this is my lesson."; char str2[] = "is"; cout<<isBF(str1,str2)<<endl; return 0; }
輸出1
綜上假設(shè)字符串T的長度為n,字符串P的長度為m,則整個算法的時間復(fù)雜度為O( n * m ),而對于一個復(fù)雜的現(xiàn)實情況而言 n >> m >> 2 (即n遠(yuǎn)遠(yuǎn)大于m,m遠(yuǎn)遠(yuǎn)大于常數(shù)),這樣的計算計算機(jī)的負(fù)擔(dān)很重。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程