您好,登錄后才能下訂單哦!
通常看到strrchr這個函數,人們很自然的想問庫里面有沒有strrstr這個函數呢???
答案是:沒有。
但是我們可以自己實現一個strrstr函數,它的功能是查找最后一次出現的子字符串,如果找打則返回這個地址,如果沒找到則返回空地址。
實現方案:對于這個函數有兩種實現方式。
第一種是從后向前找,第一次找到就返回這個地址。
第二種是從前向后找,用一個標簽記錄第一次找到的位置,然后當第二次找到時再更新這個標簽,最后標簽里面保存的地址就是我們要找的地址。
從后向前找:
#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> char *my_strrstr(const char *dst, const char *src) { assert(dst ); //對字符串進行斷言,判斷是否為空 assert(src ); const char *pdst = dst; const char *psrc = src; char *tmp = NULL ; while (*pdst) //因為要從后向前找,則首先讓pdst指向'\0' { pdst++; } while (pdst >= dst ) //當pdst大于dst則表明dst這個字符串還沒有找完 { if (tmp=(char *)strstr(pdst, psrc = src)) //使用strstr幫助尋找,找到保存到tmp return tmp; pdst--; } return NULL ; } int main() { char arr[30]; char arr1[20]; scanf( "%s%s", arr, arr1); char *ret=my_strrstr(arr, arr1); printf( "%#p\n", ret); system( "pause"); return 0; }
//當字符串很大時,效率很高
從前向后找:
char *my_strrstr(const char *dst, const char *src) { assert(dst ); assert(src ); const char *pdst = dst; const char *psrc = src; char *right= NULL ; while (*dst ) { while (*pdst == *psrc) { if (*pdst== '\0' ) //如果pdst指向'\0'則表明目標數組已經找完 return right=(char *)dst; else { pdst++; psrc++; } } if (*psrc == '\0' ) //src已經則dst中出現,將這個地址保存起來 right = (char *)dst ; pdst = ++ dst; psrc = src; } return right; } int main() { char arr1[50] = { 0 }; char arr2[40] = { 0 }; char *place = NULL ; scanf( "%s%s",arr1, arr2); place = my_strrstr(arr1, arr2); printf( "%#p\n",place); system( "pause"); return 0; }
//當目標字符串很大時,效率特別低
strtok:
功能: 可以將一個字符串按照分隔符分開讀取
原型: char * strtok(char *str,const char *sep);
str是要讀取的字符串,這個字符串里面包含了若干sep中的字符。sep指向分隔符字符串。strtok找到str中下一個標記,并用'\0'替換。
用法:
例:arr[]="ab@cd#ef$gh#"; sep[]="@#$".
將str按照sep中出現的分隔符分隔開來。如果參數arr非空,則strtok將找到第一個標記,將它賦成‘\0',并保存它的下一個位置。
第一次調用strtok(arr,sep);返回首地址,保存c的地址。
第二次調用strtok(NULL,sep);str參數為NULL,則strtok從c的位置尋找下一個分隔符。也就是找到#后將#換成'\0'并返回c的地址。
此后再調用strtok和第二次類似:如果str參數為NULL,則strtok就在同一個字符串中從上次保存的位置尋找下一個分隔符。
strtok實現:
char *my_strtok(char *dst, char const * sep) { assert(dst ); //斷言字符串是否為空 assert(sep ); static char *pdst=NULL; //聲明一個靜態局部變量 char *origin = NULL ; if (dst ) pdst = dst; origin = pdst; //記錄起始位置 while( !strchr(sep , *pdst)||*pdst) //尋找分隔符,當遇到'\0'程序結束 { pdst++; } if (*pdst) //如果找到分隔符 *pdst++ = '\0'; //將分隔符換成'\0' return origin; } int main() { char *ret = NULL ; char arr[20]; char *arr1="@#$" ; scanf( "%s", arr); for (ret = strtok(arr, arr1); ret != NULL; ret = strtok( NULL, arr1)) printf( "%s\n", ret); system( "pause"); return 0; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。