程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 字符串處理3

字符串處理3

編輯:關於C語言

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


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved