1 字符串提取數字
2 將兩個字符串合並為一個字符串並且輸出,用指針實現
3 連續字符串的字母的統計
4 刪除 包含的字符串
5 替換字符串
注:要是 對 *char類型的參數進行修改或者是 *result結果進行 返回值時,記得要 設置一個標記的指針用來返回,就像是 對鏈表的返回要標記 頭結點*head的位置一樣的道理。
======================================================================================
1 字符串提取數字
找到 0-9的字符,count++,在裡面循環直到遇到不是數字的字符。
int take_num( const char *src,int outArr[] ) { assert(src!=NULL); int count=0,tmp; while(*src!='\0') { tmp=0; if(*src>='0'&&*src<='9') { while(*src>='0'&&*src<='9') { tmp=tmp*10+*src-'0'; src++; } outArr[count]=tmp; count++; } src++; } printArrray(outArr,count); return count; }
2 將兩個字符串合並為一個字符串並且輸出,用指針實現
生成新的字符串result---使用一個 address記錄返回的地址,同時在復制完畢後加上'\0'
const char * mergeString( const char *str1,const char *str2 ) { if(str1==NULL) return (char*)str2; if(str2==NULL) return (char*)str1; char *result,*address; result=new char[strlen(str1)+strlen(str2)+1]; //每生成一個結果,相應的加上有關返回地址的東西。 address=result; /*cout<<str1<<str2<<endl;*/ while(*str1!='\0') { *result++=*str1++; } while(*str2!='\0') { *result++=*str2++; } *result='\0'; cout<<address<<endl; return address; }
3 連續字符串的字母的統計
void countString( const char *str ) { assert(str!=NULL); /*int *a=new int[52];*/ int a[52]={0}; while(*str!='\0') { a[*str-'A']++; str++; } for(int i=0;i<52;i++) { if(a[i]!=0) cout<<char(i+'A')<<a[i]; } }
4 刪除 包含的字符串
主要就是:tmp被賦值與 刪除字符串的長度,用於字符串匹配strcmp),找到就行處理result,count或者是 src+=n個單位),其他情況直接賦值就是了。
int delete_substring( const char *src,const char *substring ,char *result ) { assert(src!=NULL&&substring!=NULL); int count=0; char *tmp=new char[strlen(substring)+1]; //標記是否含有 substring。 char *pCpy=result; while(*src!='\0') { if(*src==*substring) //這裡也是可以直接 strncpy(tmp,src,strlen(substring)); 然後進行判斷的 { strncpy(tmp,src,strlen(substring)); *(tmp+strlen(substring))='\0'; if(strcmp(substring,tmp)==0) { // 找到了,在這裡進行操作。核心) count++; cout<<count<<endl; src+=strlen(substring); } else { *pCpy=*src; pCpy++; src++; } } else { *pCpy=*src; pCpy++; src++; } } *pCpy='\0'; //新的字符串,加上'\0'標志了 free(tmp); cout<<"處理後的字符串是:"<<result<<" 刪除的個數是"<<count<<endl; return count; }
5 替換字符串
主要就是:tmp被賦值與 刪除字符串的長度,用於字符串匹配strcmp),找到就行處理result,count或者是 src+=n個單位),其他情況直接賦值就是了。
// 1 找到第一個替換的位置: 2 tmp 3部分:之前的替換-old換成new-連接上後面的內容 3 tmp替換當前的字符串,循環 // 1 abcddfabg (ab換成xyz) 2 1-xyz-cddfabg 3 下一輪的循環。??? char * replaceString( char *src,const char *oldstr,const char *newstr ) { assert(src&&oldstr&&newstr); int lenstrlen(src); int lenold=strlen(oldstr); int lennew=strlen(newstr); char *result,*tmp,*markNew; result=new char[lennew>lenold? lensrc/lenold*lennew+1:lensrc]; //最大的空間內存:關鍵點 char *fanhui=result; //加上一個返回的指針的地址,必須的呀。 tmp=new char[lenold+1]; cout<<src<<endl; while(*src!='\0') { if(*src==*oldstr) { strncpy(tmp,src,lenold); tmp[lenold]='\0'; if(strcmp(tmp,oldstr)==0) { //字符串替換 就在這裡了,同時 遍歷指針移動lenold。 同樣的可以在這裡 得到替換的次數。 markNew=(char*)newstr; while(*markNew!='\0') { *result++=*markNew++; } src+lenold; } else { *result++=*src++; } } else { *result++=*src++; } } *result='\0'; cout<<fanhui<<endl; return fanhui; //assert(src&&oldstr&&newstr); //char *pStr=src; //char *findLocation; //findLocation=strstr(pStr,oldstr); //cout<<findLocation<<endl; //while(findLocation!=NULL) //{ // char *tmp = (char*)malloc(strlen(pStr) + (strlen(newstr) - strlen(oldstr)) +1); // strncpy(tmp, pStr, findLocation-pStr); // tmp[findLocation-src] = '\0'; // strcat(tmp, newstr); // strcat(tmp, findLocation+strlen(oldstr)); // findLocation=strstr(tmp,oldstr); // cout<<findLocation<<endl; // cout<<tmp<<endl; // pStr = strdup(tmp); // free(tmp); // //strcpy(pStr,tmp); //拷貝,但是內存不足:以原先的字符串要長一些怎麼把???這個有關內存釋放的老是出現問題。 //} //cout<<pStr<<endl; //return pStr; }
測試代碼:
char *str1="abcdabac"; char *str2="ab"; char *result=new char[strlen(str1)+1]; delete_substring(str1,str2,result); char *strin="af52d78d56dd89d"; int *outArray=new int[strlen(strin)]; //int outArray[]=new int[strlen(strin)]; //錯誤的,new返回的是 *int類型的 take_num(strin,outArray); char *srcstr="22abcdabokabhaha"; char *newstr="xyz"; char *oldstr="ab"; replaceString(srcstr,oldstr,newstr); /*char *str1="nihao"; char *str2="xyz"; mergeString(str1,str2);*/ char *str="aaabbbbDDdjingianigndai"; countString(str);