遍歷統計、移動和倒排

首先是遍歷的統計

函數findStr()功能是統計一個長度為2的字符串在另一個字符串中出現的次數。例如假定輸入的字符串是“as asd asde  deas ”,子字符串是“as”,則函數的返回值是4.

int findStr(char *str ,char *substr)
{
    int n = 0;      /*定義計數器變量,統計出現次數*/
    char *p,*r;     /*定義指針變量來分別指向兩個字符串*/
    while(*str)     /*如果字符串沒有結束,則一直循環*/
    {
        p = str;        /*指針p指向字符串首地址*/
        r = substr;     /*指針r指向子字符串首地址*/
        while(*r)       /*如果子字符串沒有結束,則一直循環*/
            if (*r == *p)       /*如果子字符串的第一個字符和字符串中的該字符相同*/
            {
                r++;        /*繼續比較下一個字符*/
                p++;        
            }
            else 
                break;      /*否則退出循環*/
        if (*r == '\0')     /*如果子字符串在主串中出現一次*/
            n++;        /*則n加1,進行統計*/
        str++;      /*指向字符串的下一個字符*/
    }
    return n;       /*返回統計結果*/
}

其次是遍歷移動

函數StrOR()的功能是以行為單位把字符串中的所有小寫字母“o”左邊的字符串內容移至該串的右邊存放,然后把小寫字母“o”刪除,余下的字符串內容移到已處理字符串的左邊存放,最后把已處理的字符串仍按行重新存入字符串數組xx中

void StrOR(void)
{
    int i,j,k;      /*定義循環控制變量*/
    int index,str;      /*定義變量*/
    char ch;        /*定義暫存變量*/
    for(i=0,i<maxline;i++)       /*逐行獲取字符串數據進行處理*/
    {
        str = strlen(xx[i]);        /*各行的長度*/
        index = str;
        for(k = j;j<str;j++)     /*將一行中所有小寫字母o右邊的字符一次向左移一位,并刪除o*/
            if (xx[i][j] == 'o')
            {
                for (k = j;k<str - 1;k++)        /*o右邊的字符串左移一位*/
                    xx[i][j] = xx[i][k+1];
                xx[i][str-1] = '';
                index = j;      /*記錄最后一個o所在的位置*/
                j = 0;      /*處理完后從改行開頭繼續尋找下一個o*/
            }
        for (j = str -1;j>=index;j--)        /*最后一個o右側所有字符都移到已處理字符串的左邊*/
        {
            ch = xx[i][str - 1];
            for(k=str-1;k>0;k--)
                xx[i][k] = xx[i][k-1];
            xx[i][0] = ch;
        }
    }   
}
最后一個是遍歷倒排

函數StrOL()的功能是以行為單位對行中以空格或標點符號為分隔的所有單詞進行倒排。最后把已處理的字符串(不含標點符號)仍按行重新存入字符串數組xx中,例如原文:You He Me  結果是:Me He  You

void StrOL(void)
{
    int i,j,k;      /*定義數組下標變量*/
    char t[80],t1[80];      /*定義數組暫存取得的單詞*/
    for(i=0;i<maxline;i++)       /*逐行獲取字符串數據*/
    {
        j=k=strlen(xx[i])-1;        /*將每行末尾字符的下標保存在j和k中*/
        t[0]=t1[0]='/0';        /*初始化兩個字符數組*/
        while (1)       /*無條件循環,循環體內有結束循環的語句*/
        {
            while(isalpha(xx[i][j]==0) && j>=0)      /*若以下標為j的字符不是字母并且還在數組xx中*/
                k = --j;        
            while (isalpha(xx[i][j]) && j>=0)        /*若以下標為j的字符是字母并且還在數組xx中*/
                j--;        /*當退出這個循環時,xx[i][j+1]和xx[i][k]分別是同一個單詞的第1個和最后一個字母*/

            memcpy(t1,&xx[i][j+1],k-1);     /*將該單詞保存到字符數組t1中*/
            t1[k-j] = '/0';     /*為t1中的單詞添加字符結束標志*/
            strcat(t,t1);       /*將單詞保存到數組t中*/
            strcat(t," ");      /*單詞之間用空格分割*/
            if(j<0)      /*如果以j為下標的字符不再數組xx中*/
            break;      /*退出外層while循環*/
        }
    strcpy(xx[i],t);        /*按行將處理完的字符串重新保存到數組xx中*/
    }
}
這三道題在歷年的考試所占比重為3%,但倒霉的是我就偏偏抽中了第一種題(估計買彩票一定能中)。幸好考試之前感覺自己沒那么好的運氣,會抽到容易的題,所以花費了整個上午的時間來研究這幾道題。還不錯,至少最后能夠運行出正確的結果。

 本文由用戶 ptjs 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!