c语言没有像java那么丰富的字符串操作函数,很多有用的函数得自己写,搞了一天,写了几个常用函数,留着以后有用。

 

  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:

 

  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:

 

  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:||||

posted on 2012-05-04 17:31  一个人的天空@  阅读(18622)  评论(0编辑  收藏  举报