zoukankan      html  css  js  c++  java
  • linux c语言字符串函数replace,indexOf,substring等的实现(转)

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

  • 相关阅读:
    codevs2034 01串2
    codevs2622数字序列( 连续子序列最大和O(n)算法)
    codevs3008加工生产调度(Johnson算法)
    codevs1955光纤通信(并查集)
    codevs4203山区建小学
    codevs2618核电站问题
    常用端口
    ntp时间同步服务器
    date linux系统校正时间
    用户切换
  • 原文地址:https://www.cnblogs.com/qq78292959/p/2483049.html
Copyright © 2011-2022 走看看