你必須知道的指針基礎-5.指針的幾個小應用案例


一、使用指針傳出分解后的數字

  實現一個方法“多個返回值”的效果:返回一個三位數數字的個位、十位、百位。這里,我們借助指針來”返回“分解后的結果。這種應用也是最常見的指針應用。

// fun1:分解一個三位數,傳遞個位、十位和百位數字
int parseNumber(int num,int* g,int* s,int* b)
{
    if(num < 100 || num > 999)
    {
        // 只允許100~999的數字
        return -1;
    }

    *g = num % 10;
    *s = (num / 10)%10;
    *b = (num/100)%10;

    return 1;
}

  測試數字為365,調用parseNumber函數,將要返回的值的地址作為參數傳遞:

int main(int argc, char *argv[])
{
    int num = 365;
    int g,s,b;
    if(parseNumber(num,&g,&s,&b))
    {
        printf("%d %d %d\n",b,s,g);
    }
    return 0;            
}

  運行結果如下圖所示:

二、自己動手實現strlen()函數

  我們知道strlen是計算字符串的長度,其內部是通過判斷是否以'\0'作為結束符,雖然其不是一個安全的方式,但是卻是各大C教材中最常見的函數。這里,我們來自己實現一個strlen函數,利用指針的移動來輔助計算長度,這也是指針的一個最常見的應用。

// fun2:自己模擬實現strlen函數
int myStrlen(char* str)
{
    int len = 0;
    while(*str != '\0')
    {
        str++;
        len++;
    }

    return len;
}

  測試字符串為”hello“,長度為5,Main函數聲明如下:

int main(int argc, char *argv[])
{
    char test[] = "hello";
    int len = myStrlen(test);
    printf("The length of 'hello' is %d\n",len);
    return 0;
}

  運行結果如下圖所示:

三、判斷字符串A是否以字符串B結尾

  判斷一個字符串是否以另一個子子字符串結尾,這個方法在Java中屬於String類,叫做endsWith。在C#中,也位於String類,叫做EndsWith,並提供了三個重載。這里,我們借助指針來輔助實現這個經典的endsWith方法。

// fun3:判斷字符串A是否以字符串B結尾
int endsWith(char* str,char* substr)
{
    int strlen = 0;
    while(*str != '\0')
    {
        str++;
        strlen++;
    }

    int sublen = 0;
    while(*substr != '\0')
    {
        substr++;
        sublen++;
    }

    if(strlen < sublen)
    {
        // 如果子串長度比主串還長
        return -1;
    }

    int i;
    for(i=0;i<=sublen;i++)
    {
        // 從末尾開始對比每一個字符
        char strCh = *str;
        char subCh = *substr;
        if(strCh != subCh)
        {
            return 0;
        }
        else
        {
            str--;
            substr--;
        }
    }

    return 1;
}

  該方法主要經歷兩個步驟,一是分別計算主串和子串的長度,如果子串長度超過主串長度,那么直接返回0,代表主串不以子串結尾;二是分別從末尾對主串和子串的每一個字符進行比對,直到循環結束(判斷條件是子串的長度),如果其中有一個不同,那么直接返回0。

  下面對這個endsWith函數進行一個簡單的測試,分別給出一個合適的用例和不合適的用例:、

int main(int argc, char *argv[])
{
    char str[] = "edisonchou";
    char sub[] = "chou";
    printf("%d\n", endsWith(str,sub));
    char sub2[] = "zhou";
    printf("%d\n", endsWith(str,sub2));
    
    return 0;
}

  運行結果如下圖所示:

參考資料

  如鵬網,《C語言也能干大事(第三版)》

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM