標籤:常用的字串處理函數實現(不調用庫函數)
描述:C語言中對於字串類型並未定義,但存在許多有關字串的庫函數(如:strstr(在原串中匹配子串),strcpy(將原串內容拷貝到目標串中),strcmp(比較兩個字串的內容),strcat(串連兩個字串,亦為字串的追加),strlen(求取字串的長度)....),我們可以自己編寫程式實現以上功能的函數,而不調用庫函數,,,再對照庫函數進行學習,有利於提高自身的編程能力。
//1.strcat函數(串連兩個字串,亦為字串的追加)#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strcat(char *arr1,const char *arr2){assert(arr1);assert(arr2);char *ret = arr1;while (*ret){ret++; //ret指標不斷移動,直至位於arr1數組的‘\0’處}while (*ret++ = *arr2++) //不斷將arr2數組的內容追加到arr1中,註:(arr1中的‘\0’會被arr2中的第一個字元覆蓋,最後arr2中的‘\0’被追加到arr1的末尾位置,否則數組中沒有結束標誌){;}return arr1;}int main(){char arr1[30] = "wlcome"; //注意目標串中要留夠足夠的空間char arr2[] = " to China!";my_strcat(arr1,arr2);printf("%s\n",arr1);system("pause");return 0;}
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/76/34/wKiom1ZMhtWBdK9_AAAbolAJ62Y992.png" title="運行結果" alt="wKiom1ZMhtWBdK9_AAAbolAJ62Y992.png" />
//2.strcpy函數(將原串內容拷貝到目標串中)#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strcpy(char *dest,const char *src){assert(dest);assert(src);char *ret = dest;while (*ret++ = *src++) //不斷將原串的內容拷貝到目標串中{;}return dest;}int main(){char arr1[10]="hello"; //原目標串為"hello",拷貝完成後變為"welcome",原串被覆蓋char arr2[10] = "welcome";my_strcpy(arr1,arr2);printf("%s\n",arr1);system("pause");return 0;}
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/76/34/wKiom1ZMiE6jlMJuAAAWL7ndsA0557.png" title="運行結果" alt="wKiom1ZMiE6jlMJuAAAWL7ndsA0557.png" />
//3.strstr函數(在原串中匹配子串)#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strstr(char *src, char *dst){assert(dst);assert(src);char *p = src;char *q = dst;while ((*dst) && (*src)){if (*src == *dst) //兩指標內容相等時,指標向後移動不斷匹配{src++;dst++;}else{src = ++p; //指標內容不等時,子串指標跳至首地址,原串返回到此次匹配開始的下一位置dst = q;p = src;}}if (*dst == ‘\0‘) //子串為‘\0‘時,說明匹配完成,返回原串與子串相同的首地址處{return p;}else{return NULL; //沒有匹配項,返回空}}int main(){char arr1[20] = "wwwworld";char arr2[20] = "wworld";char *ret=my_strstr(arr1,arr2);printf("%s\n",ret);system("pause");return 0;}
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/76/33/wKioL1ZMilbzpJYkAAAXiE65AFw689.png" title="運行結果" alt="wKioL1ZMilbzpJYkAAAXiE65AFw689.png" />
//4.strlen函數(求取字串的長度,此處有三種做法)#include<stdio.h>#include<stdlib.h>#include<assert.h>//①.計數器計數字串長度int my_strlen(const char *str){assert(str);int count = 0;while (*str++){count++;}return count;}//②.遞迴調用1+函數本身(指標不斷位移)int my_strlen(const char *str){assert(str);int num = 0;while (*str){return num=(1+my_strlen(str + 1));}return num;}//③.指標末位置減去指標初始位置再減一(末位置為‘\0’)int my_strlen(const char *str){assert(str);char *pre = str;while (*pre++){;}return (pre - str - 1);}int main(){char arr[] = "hello,world!";int ret=my_strlen(arr);printf("length=%d\n",ret);system("pause");return 0;}
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M01/76/33/wKioL1ZMi7SQ17J3AAAaaFHCIvY413.png" title="運行結果" alt="wKioL1ZMi7SQ17J3AAAaaFHCIvY413.png" />
//5.strcmp函數(比較兩個字串的內容,此處有兩種做法,大體上很相似,最大區別為一個方法返回0,-1,1這三種值,另一個方法返回的是0,或者為兩個串中不同字元的差值)#include<stdio.h>#include<stdlib.h>#include<assert.h>//①.傳回值為0,-1,1的方法實現int my_strcmp(const char *str1, const char *str2){assert(str1);assert(str2);while (*str1 == *str2) //迴圈執行的條件為兩個指標所指向的內容相同{if (*str1 == ‘\0‘) //若有一個指標指向了‘\0’,則另一個也為‘\0’,說明兩串相同,返回0{return (0);}str1++;str2++;}if ((*str1 - *str2) > 0) //跳出迴圈的條件為存在不同字元,則分別處理傳回值return (1);elsereturn (-1);}//②.傳回值為0,或者為兩個串中不同字元的差值int my_strcmp(const char *str1,const char *str2){assert((str1)&&(str2));while ((*str1) && (*str2)) //迴圈執行的條件為str1和str2都不為‘\0’結束標誌{if (*str1 == *str2) //如果兩指標指向的內容相同,則指標分別移動{str1++;str2++;}elsereturn *(unsigned char *)(str1) - *(unsigned char *)(str2); //如果兩指標指向的內容不同,則返回兩字元的差值,因為char在vs2013中與有符號的char保持一致,所以其能表示的最大正值為127,最小負值為-128,但由ascII碼錶可知有256中字元,所以產生的差值會溢出,無法正確表示,所以將其轉化為unsigned char的形式}if ((*str1 == *str2) && (*str1 == ‘\0‘)) //跳出迴圈的條件為兩字串中至少有一指標移動至‘\0’處,如果兩個指標都指向‘\0’返回0,否則返回兩字元的差值{return 0;}else{return *(unsigned char *)(str1) - *(unsigned char *)(str2);}return -1; //函數最後要有一個傳回值,但無其他異常情況,返回一個-1即可}int main(){char arr1[] = "hello,world!";char arr2[] = "hello,China!";int ret=my_strcmp(arr1,arr2);printf("%d\n",ret);system("pause");return 0;}
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/76/34/wKioL1ZMkjrTBE4NAAATVWbXMG8995.png" title="運行結果" alt="wKioL1ZMkjrTBE4NAAATVWbXMG8995.png" />650) this.width=650;" src="http://s1.51cto.com/wyfs02/M00/76/34/wKioL1ZMkkmBn3LDAAAX_WPxxLc577.png" title="運行結果" alt="wKioL1ZMkkmBn3LDAAAX_WPxxLc577.png" />
本文出自 “溫暖的微笑” 部落格,請務必保留此出處http://10738469.blog.51cto.com/10728469/1714503
常用的字串處理函數實現(不調用庫函數)