linux c语言字符串函数replace,indexOf,substring等的实现

http://blog.csdn.net/wangguanguo/article/details/6051130

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

[cpp]
  1. #include <string.h>  
  2. #include <stdio.h>  

  3. /*将strSrc字符串中第一次出现的strDest字符串替换成strReplace*/  
    void replaceFirst(char **strSrc,char *strDest,char *strReplace)  
    {  
        char str4[strlen(*strSrc)+1];  
        char *p;  
        strcpy(str4,*strSrc);  
        int nLenFirstPart = 0;
        if((p=strstr(*strSrc,strDest))!=NULL)/*p指向strDest在strSrc中第一次出现的位置*/  
        {
            while(*strSrc!=p && *strSrc!=NULL)/*将strSrc指针移动到p的位置*/  
            {  
                nLenFirstPart++;
                (*strSrc)++;
            }  
            memset(*strSrc,0,strlen(*strSrc));/*将strSrc指针指向的值变成/0,以此来截断strSrc,舍弃strDest及以后的内容,只保留strDest以前的内容*/  
            strncpy(*strSrc,str4,nLenFirstPart);/*strSrc后拼接上p前面的部分*/  
            strcat(*strSrc,strReplace);/*在strSrc后拼接上strReplace*/  
            strcat(*strSrc,strstr(str4,strDest)+strlen(strDest));/*strstr(str4,strDest)是指向strDest及以后的内容(包括strDest),strstr(str4,strDest)+strlen(strDest)就是将指针向前移动strlen(strDest)位,跳过strDest*/  
        }  
    }  

    /*将strSrc出现的所有的strDest都替换为strReplace*/  
    void replace(char **strSrc,char *strDest,char *strReplace)  
    {  
        char str4[strlen(*strSrc)+1],strRemain[strlen(*strSrc)+1],strFirstPart[256];  
        char *p;  
        strcpy(str4,*strSrc);  
        strcpy(strRemain,*strSrc);
        int nLenFirstPart = 0;
        
        memset(*strSrc,0,strlen(*strSrc));/*将strSrc指针指向的值变成0*/  
        memset(strFirstPart,0,sizeof(strFirstPart));
        while((p=strstr(strRemain,strDest))!=NULL)/*p指向strDest在strRemain中第一次出现的位置*/  
        {
            nLenFirstPart = 0;
            while(&strRemain[nLenFirstPart] != p && strRemain[nLenFirstPart] != '\0')/*将strRemain指针移动到p的位置*/  
            {  
                nLenFirstPart++;
            }  
            /*strSrc后拼接上p前面的部分*/  
            strncpy(strFirstPart,strRemain,nLenFirstPart);
            strFirstPart[nLenFirstPart] = '\0';
            strcat(*strSrc,strFirstPart);
            strcat(*strSrc,strReplace);/*在strSrc后拼接上strReplace*/

            strcpy(strRemain,p+strlen(strDest));    // strRemain指向去掉了最前面的strDest的p
        }
        strcat(*strSrc,strRemain);/*strstr(str4,strDest)是指向strDest及以后的内容(包括strDest),strstr(str4,strDest)+strlen(strDest)就是将指针向前移动strlen(strDest)位,跳过strDest*/  
    }


  4. /*截取src字符串中,从下标为start开始到end-1(end前面)的字符串保存在dest中(下标从0开始)*/  
  5. void substring(char *dest,char *src,int start,int end)  
  6. {  
  7.     char *p=src;  
  8.     int i=start;  
  9.     if(start>strlen(src))return;  
  10.     if(end>strlen(src))  
  11.         end=strlen(src);  
  12.     while(i<end)  
  13.     {     
  14.         dest[i-start]=src[i];  
  15.         i++;  
  16.     }  
  17.     dest[i-start]='/0';  
  18.     return;  
  19. }  
  20. /*返回src中下标为index的字符*/  
  21. char charAt(char *src,int index)  
  22. {  
  23.     char *p=src;  
  24.     int i=0;  
  25.     if(index<0||index>strlen(src))  
  26.         return 0;  
  27.     while(i<index)i++;  
  28.     return p[i];  
  29. }  
  30. /*返回str2第一次出现在str1中的位置(下表索引),不存在返回-1*/  
  31. int indexOf(char *str1,char *str2)  
  32. {  
  33.     char *p=str1;  
  34.     int i=0;  
  35.     p=strstr(str1,str2);  
  36.     if(p==NULL)  
  37.         return -1;  
  38.     else{  
  39.         while(str1!=p)  
  40.         {  
  41.             str1++;  
  42.             i++;  
  43.         }  
  44.     }  
  45.     return i;  
  46. }  
  47. /*返回str1中最后一次出现str2的位置(下标),不存在返回-1*/  
  48. int lastIndexOf(char *str1,char *str2)  
  49. {  
  50.     char *p=str1;  
  51.     int i=0,len=strlen(str2);  
  52.     p=strstr(str1,str2);  
  53.     if(p==NULL)return -1;  
  54.     while(p!=NULL)  
  55.     {  
  56.         for(;str1!=p;str1++)i++;  
  57.         p=p+len;  
  58.         p=strstr(p,str2);  
  59.     }  
  60.     return i;  
  61. }  
  62. /*删除str左边第一个非空白字符前面的空白字符(空格符和横向制表符)*/  
  63. void ltrim(char *str)  
  64. {  
  65.     int i=0,j,len=strlen(str);  
  66.     while(str[i]!='/0')  
  67.     {  
  68.         if(str[i]!=32&&str[i]!=9)break;/*32:空格,9:横向制表符*/  
  69.         i++;  
  70.     }  
  71.     if(i!=0)  
  72.     for(j=0;j<=len-i;j++)  
  73.     {     
  74.         str[j]=str[j+i];/*将后面的字符顺势前移,补充删掉的空白位置*/  
  75.     }  
  76. }  
  77. /*删除str最后一个非空白字符后面的所有空白字符(空格符和横向制表符)*/  
  78. void rtrim(char *str)  
  79. {  
  80.     char *p=str;  
  81.     int i=strlen(str)-1;  
  82.     while(i>=0)  
  83.     {  
  84.         if(p[i]!=32&&p[i]!=9)break;  
  85.         i--;  
  86.     }  
  87.     str[++i]='/0';  
  88. }  
  89. /*删除str两端的空白字符*/  
  90. void trim(char *str)  
  91. {  
  92.     ltrim(str);  
  93.     rtrim(str);  
  94. }  
 

保存为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:||||

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值