linux c語言字串函數replace,indexOf,substring等的實現)

來源:互聯網
上載者:User

c語言沒有像java那麼豐富的字串操作函數,很多有用的函數得自己寫,搞了一天,寫了幾個常用函數,留著以後有用。

 

[cpp] view plaincopy

  1. #include <string.h>  
  2. #include <stdio.h>  
  3. /*將str1字串中第一次出現的str2字串替換成str3*/  
  4. void replaceFirst(char *str1,char *str2,char *str3)  
  5. {  
  6.     char str4[strlen(str1)+1];  
  7.     char *p;  
  8.     strcpy(str4,str1);  
  9.     if((p=strstr(str1,str2))!=NULL)/*p指向str2在str1中第一次出現的位置*/  
  10.     {  
  11.         while(str1!=p&&str1!=NULL)/*將str1指標移動到p的位置*/  
  12.         {  
  13.             str1++;  
  14.         }  
  15.         str1[0]='\0';/*將str1指標指向的值變成/0,以此來截斷str1,捨棄str2及以後的內容,只保留str2以前的內容*/  
  16.         strcat(str1,str3);/*在str1後拼接上str3,組成新str1*/  
  17.         strcat(str1,strstr(str4,str2)+strlen(str2));/*strstr(str4,str2)是指向str2及以後的內容(包括str2),strstr(str4,str2)+strlen(str2)就是將指標向前移動strlen(str2)位,跳過str2*/  
  18.     }  
  19. }  
  20. /*將str1出現的所有的str2都替換為str3*/  
  21. void replace(char *str1,char *str2,char *str3)  
  22. {  
  23.     while(strstr(str1,str2)!=NULL)  
  24.     {  
  25.         replaceFirst(str1,str2,str3);  
  26.     }  
  27. }  
  28. /*截取src字串中,從下標為start開始到end-1(end前面)的字串儲存在dest中(下標從0開始)*/  
  29. void substring(char *dest,char *src,int start,int end)  
  30. {  
  31.     int i=start;  
  32.     if(start>strlen(src))return;  
  33.     if(end>strlen(src))  
  34.         end=strlen(src);  
  35.     while(i<end)  
  36.     {     
  37.         dest[i-start]=src[i];  
  38.         i++;  
  39.     }  
  40.     dest[i-start]='\0';  
  41.     return;  
  42. }  
  43. /*返回src中下標為index的字元*/  
  44. char charAt(char *src,int index)  
  45. {  
  46.     char *p=src;  
  47.     int i=0;  
  48.     if(index<0||index>strlen(src))  
  49.         return 0;  
  50.     while(i<index)i++;  
  51.     return p[i];  
  52. }  
  53. /*返回str2第一次出現在str1中的位置(下表索引),不存在返回-1*/  
  54. int indexOf(char *str1,char *str2)  
  55. {  
  56.     char *p=str1;  
  57.     int i=0;  
  58.     p=strstr(str1,str2);  
  59.     if(p==NULL)  
  60.         return -1;  
  61.     else{  
  62.         while(str1!=p)  
  63.         {  
  64.             str1++;  
  65.             i++;  
  66.         }  
  67.     }  
  68.     return i;  
  69. }  
  70. /*返回str1中最後一次出現str2的位置(下標),不存在返回-1*/  
  71. int lastIndexOf(char *str1,char *str2)  
  72. {  
  73.     char *p=str1;  
  74.     int i=0,len=strlen(str2);  
  75.     p=strstr(str1,str2);  
  76.     if(p==NULL)return -1;  
  77.     while(p!=NULL)  
  78.     {  
  79.         for(;str1!=p;str1++)i++;  
  80.         p=p+len;  
  81.         p=strstr(p,str2);  
  82.     }  
  83.     return i;  
  84. }  
  85. /*刪除str左邊第一個非空白字元前面的空白字元(空格符和橫向定位字元)*/  
  86. void ltrim(char *str)  
  87. {  
  88.     int i=0,j,len=strlen(str);  
  89.     while(str[i]!='\0')  
  90.     {  
  91.         if(str[i]!=32&&str[i]!=9)break;/*32:空格,9:橫向定位字元*/  
  92.         i++;  
  93.     }  
  94.     if(i!=0)  
  95.     for(j=0;j<=len-i;j++)  
  96.     {     
  97.         str[j]=str[j+i];/*將後面的字元順勢前移,補充刪掉的空白位置*/  
  98.     }  
  99. }  
  100. /*刪除str最後一個非空白字元後面的所有空白字元(空格符和橫向定位字元)*/  
  101. void rtrim(char *str)  
  102. {  
  103.     char *p=str;  
  104.     int i=strlen(str)-1;  
  105.     while(i>=0)  
  106.     {  
  107.         if(p[i]!=32&&p[i]!=9)break;  
  108.         i--;  
  109.     }  
  110.     str[++i]='\0';  
  111. }  
  112. /*刪除str兩端的空白字元*/  
  113. void trim(char *str)  
  114. {  
  115.     ltrim(str);  
  116.     rtrim(str);  
  117. }  

 

 

儲存為mystr.c,另建立標頭檔mystr.h:

 

[cpp] view plaincopy

  1. extern void replaceFirst(char *str1,char *str2,char *str3);  
  2. extern void replace(char *str1,char *str2,char *str3);  
  3. extern void substring(char *dest,char *src,int start,int end);  
  4. extern char charAt(char *src,int index);  
  5. extern int indexOf(char *str1,char *str2);  
  6. extern int lastIndexOf(char *str1,char *str2);  
  7. extern void ltrim(char *str);  
  8. extern void rtrim(char *str);  
  9. extern void trim(char *str);  

 

 

再寫個測試檔案test.c:

 

[cpp] view plaincopy

  1. #include <string.h>  
  2. #include <stdio.h>  
  3. #include "mystr.h"  
  4. void main()  
  5. {  
  6.     char buf[20]="012345126";  
  7.     char buf2[10];  
  8.       
  9.     replaceFirst(buf,"12","9999");  
  10.     printf("replaceFirst:%s/n",buf);  
  11.     strcpy(buf,"012345126");  
  12.     replace(buf,"12","9999");  
  13.     printf("replace:%s/n",buf);  
  14.     strcpy(buf,"01234560");  
  15.     substring(buf2,buf,2,5);  
  16.     printf("substring:%s/n",buf2);  
  17.     printf("charAt:%c/n",charAt(buf,4));  
  18.     printf("indexOf:%d/n",indexOf(buf,"234"));  
  19.     printf("lastIndexOf:%d/n",lastIndexOf(buf,"0"));  
  20.     strcpy(buf,"    0123    ");  
  21.     ltrim(buf);  
  22.     printf("ltrim:||%s||/n",buf);  
  23.     strcpy(buf,"    0123     ");  
  24.     rtrim(buf);  
  25.     printf("rtrim:||%s||/n",buf);  
  26.     strcpy(buf,"    0123    ");  
  27.     trim(buf);  
  28.     printf("trim:||%s||/n",buf);  
  29.     strcpy(buf,"  ");  
  30.     trim(buf);  
  31.     printf("trim2:||%s||/n",buf);  
  32. }  

 

 

在shell中輸入

gcc test.c mystr.c -o str

./str

運行。

結果如下:

 

replaceFirst:09999345126

replace:0999934599996

substring:234

charAt:4

indexOf:2

lastIndexOf:7

ltrim:||0123 ||

rtrim:|| 0123||

trim:||0123||

trim2:||||

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.