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

  • 相关阅读:
    jQuery 基本选择器
    JavaScriptif while for switch流程控制 JS函数 内置对象
    JavaScrip基本语法
    数据库 存储引擎 表的操作 数值类型 时间类型 字符串类型 枚举集合 约束
    数据库基础知识 管理员 用户登录授权的操作
    粘包的产生原理 以及如何解决粘包问题
    socket TCP DPT 网络编程
    2018年年终总结
    Android技术分享
    No accelerator found
  • 原文地址:https://www.cnblogs.com/qq78292959/p/2483049.html
Copyright © 2011-2022 走看看