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);