一、使用指針傳出分解后的數字
實現一個方法“多個返回值”的效果:返回一個三位數數字的個位、十位、百位。這里,我們借助指針來”返回“分解后的結果。這種應用也是最常見的指針應用。
// 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語言也能干大事(第三版)》