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

字符串的處理2

編輯:關於C語言

1 寫一函數int fun(char *p)判斷一字符串是否為回文 bool isHuiwen(const char *str);

2 字符串逆序:char *inverseString(char *str);

3 求字符串中出現頻率最高的字符 :char maxCountChar_string(const char *str);

4 寫出在母串中查找子串 出現次數的代碼:int subNum_string(const char *str,const char *substring);

5 編寫一個函數,作用是把一個char組成的字符串循環右移n個。比如原來是“abcdefghi”如果n=2,移位後應該是“hiabcdefgh” :void loopMoveNum(char *pStr,int steps);

6 找字符串中最長對稱串:從最長的開始找起來--char *maxLenHuiwen(char *pStr);

7 求字符串中對稱串的個數和最長的對稱串相對應的):int countHuiwen(const char *pStr);


=========================================================================================

1 寫一函數int fun(char *p)判斷一字符串是否為回文 bool isHuiwen(const char *str);

// (str[i],str[len-1-i])比較
bool isHuiwen( const char *str )
{
    //// 1 使用 字符數組的形式。
    //assert(str!=NULL);
    //bool isTrue=true;
    //int len=strlen(str);
    //for(int i=0;i<len/2;i++)
    //{
    //  if(str[i]!=str[len-1-i])
    //  {
    //      //cout<<"bushi huiwen"<<endl;
    //      isTrue= false;
    //      break;
    //  }
    //}
    //return isTrue;
    //2 使用指針的形式。
    assert(str!=NULL);
    bool isTrue=true;
    int len=strlen(str);
    char *q=(char*)str+len-1;    //對於有const的指針,需要使用(cahr*)的形式。
    while(str<q)
    {
        if(*str!=*q)
        {
            isTrue=false;
            cout<<"bushi huiwen"<<endl;
            break;
        }
        str++;
        q--;
    }
    return isTrue;
}

2 字符串逆序:char *inverseString(char *str);

//(str[i],str[len-1-i])交換
char * inverseString( char *str )
{
    ////2 使用指針的形式。
    //assert(str!=NULL);
    //int len=strlen(str);
    //char *q=(char*)str+len-1;    //對於有const的指針,需要使用(cahr*)的形式。
    //char *add=str;
    //char tmp;
    //while(str<q)
    //{
    //  tmp=*str;
    //  *str=*q;
    //  str++;                  //往中間靠攏。
    //  q--;
    //}
    //cout<<"轉化後的字符串是:"<<add;
    //return add;
    assert(str!=NULL);
    int len=strlen(str);
    char tmp,*add=str;
    for(int i=0;i<len/2;i++)
    {
        tmp=str[i];
        str[i]=str[len-1-i];
        str[len-1-i]=tmp;
    }
    cout<<"轉化後的字符串是:"<<add<<endl;
    return add;
}

3 求字符串中出現頻率最高的字符 :char maxCountChar_string(const char *str);

//有待改進可以使用map 之類的進行整合)
char maxCountChar_string( const char *str )
{
    assert(str!=NULL);
    int allchar[26]={0};    //假設是26個小寫字母,其他的呢???重點)
    int maxNum=1;
    char *t=(char*)str,maxchar=*str;
    while(*t!='\0')
    {
        allchar[*t-'a']++;
        if(allchar[*t-'a']>maxNum)
        {
            maxchar=*t;
            maxNum=allchar[*t-'a'];
        }
        t++;
    }
    cout<<"The max number of char is "<<maxchar<<"---"<<maxNum<<endl;
    return maxchar;
}

4 寫出在母串中查找子串 出現次數:int subNum_string(const char *str,const char *substring);

//就是在 字符串匹配的基礎上加上計數的功能:可以使用 遞歸的吧???
int subNum_string( const char *src,const char *dest )
{
    assert(src!=NULL&&dest!=NULL);
    int len1,len2;
    len1=strlen(src);
    len2=strlen(dest);
    int count=0;
    for(int i=0;i<len1;i++)
    {
        for(int j=0;j<len2;j++)
        {
            if(src[i+j]!=dest[j])
            {
                break;                     //只是推出 內層循環
            }
            if(j==len2-1)
            {
                //i+len2-1=i+j
                /*printf("The location is %d--%d\n",i,i+j);*/
                count++;
                cout<<"第"<<count<<"個字符串的位置"<<i<<"--"<<i+j<<endl;
                j=0;
                break;  //跳出內層的循環,否則無線循環下去
            }
        }
    }
    cout<<"共有"<<count<<"個字符串!!!"<<endl;
    return count;
}


5 編寫一個函數,作用是把一個char組成的字符串循環右移n個。比如原來是“abcdefghi”如果n=2,移位後應該是“hiabcdefgh” :void loopMoveNum(char *pStr,int steps);

void loopMoveNum( char *pStr,int steps )
{
    ////1 memcpy 的方式得到:1 需要移動的tmp  2 前面的往後面移動  3 tmp補上位置。
    //int lenRest=strlen(pStr)-steps;
    //char *tmp;
    //tmp=(char*)malloc((steps+1)*sizeof(char));
    //assert(tmp!=NULL);
    //heheei123----123(tmp)----heh heheei(pStr)----123 heheei(pStr)
    //memcpy(tmp,pStr+lenRest,steps);
    //memcpy(pStr+steps,pStr,lenRest);
    //memcpy(pStr,tmp,steps);
    //free(tmp);
    //tmp=NULL;
    //cout<<"右移動後的字符串是"<<pStr<<endl;
    //2 使用 strcpy的方式得到。
    int lenRest=strlen(pStr)-steps;
    char *tmp;
    tmp=(char*)malloc((steps+strlen(pStr)+1)*sizeof(char));
    assert(tmp!=NULL);
    //heheei123----123(tmp)----123 heheei123(tmp)----123heei
    strcpy(tmp,pStr+lenRest);
    strcpy(tmp+steps,pStr);
    *(tmp+strlen(pStr))='\0';
    strcpy(pStr,tmp);
    free(tmp);
    tmp=NULL;
    cout<<"右移動後的字符串是"<<pStr<<endl;
}

6 找字符串中最長對稱串:從最長的開始找起來--char *maxLenHuiwen(char *pStr);

//從最長的開始找起,知道知道的話,退出循環,保存起始的位置以及長度。
char * maxLenHuiwen( char *pStr )
{
    assert(pStr!=NULL);
    int lenStr=strlen(pStr);
    if(lenStr==1)
    {
        cout<<"只有一個字符,親!!"<<endl;
        return pStr;
    }
    char *tmp;
    //stringProcess strProc;
    for(int n=lenStr;n>1;n--)
    {
        for(int m=0;m<=lenStr-n;m++)
        {
            tmp=new char[n+1];
            memcpy(tmp,pStr+m,n);
            *(tmp+n)='\0';
            //strProc.strncpy1(tmp,pStr+m,n);        //使用自己編寫的類,具有重大的意義。
            if(isHuiwen(tmp))
            {
                cout<<"最大的對稱串是"<<tmp<<",長度為"<<n<<endl;
                return tmp;
            }
        }
        //delete []tmp;
    }
    cout<<"很抱歉,沒有找到對稱的字符串!!!"<<endl;
    return NULL;
}

7 求字符串中對稱串的個數和最長的對稱串相對應的):int countHuiwen(const char *pStr);

//從小到大或者是從大到小)的順序:找到一個加上一個的 數量,而不是break;
int countHuiwen(const char *pStr )
{
    assert(pStr!=NULL);
    int count=0;
    int len=strlen(pStr);
    if(len==1)
    {
        cout<<"只有一個字符,親!!"<<endl;
        return 1;
    }
    char *tmp;
    for(int num=2;num<=len;num++)    //num:對稱串的長度
    {
        for(int m=0;m<=len-num;m++)
        {
            tmp=new char[num+1];
            //memcpy(tmp,pStr+m,num);
            strncpy(tmp,pStr+m,num);
            *(tmp+num)='\0';
            if(isHuiwen(tmp))
            {
                count++;
                cout<<"第"<<count<<"個對稱串是"<<tmp<<",起始位置是"<<m<<",長度為"<<num<<endl;
            }
        }
        delete []tmp;
    }
    cout<<"對稱串的個數是:"<<count<<endl;
    return count;
}


測試代碼

int main()
{
    //char str[]="heeheei123";
    //isHuiwen(str);
    //inverseString(str);
    /*maxCountChar_string(str);*/
    /*char str1[]="hahahanihaohah";
    char str2[]="hah";
    subNum_string(str1,str2);*/
    //loopMoveNum(str,3);
    char str[]="heehee";
    //maxLenHuiwen(str);
    countHuiwen(str);
    return 0;
}


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