c語言沒有像java那麼豐富的字串操作函數,很多有用的函數得自己寫,搞了一天,寫了幾個常用函數,留著以後有用。
[cpp] view plaincopy
- #include <string.h>
- #include <stdio.h>
- /*將str1字串中第一次出現的str2字串替換成str3*/
- void replaceFirst(char *str1,char *str2,char *str3)
- {
- char str4[strlen(str1)+1];
- char *p;
- strcpy(str4,str1);
- if((p=strstr(str1,str2))!=NULL)/*p指向str2在str1中第一次出現的位置*/
- {
- while(str1!=p&&str1!=NULL)/*將str1指標移動到p的位置*/
- {
- str1++;
- }
- str1[0]='\0';/*將str1指標指向的值變成/0,以此來截斷str1,捨棄str2及以後的內容,只保留str2以前的內容*/
- strcat(str1,str3);/*在str1後拼接上str3,組成新str1*/
- strcat(str1,strstr(str4,str2)+strlen(str2));/*strstr(str4,str2)是指向str2及以後的內容(包括str2),strstr(str4,str2)+strlen(str2)就是將指標向前移動strlen(str2)位,跳過str2*/
- }
- }
- /*將str1出現的所有的str2都替換為str3*/
- void replace(char *str1,char *str2,char *str3)
- {
- while(strstr(str1,str2)!=NULL)
- {
- replaceFirst(str1,str2,str3);
- }
- }
- /*截取src字串中,從下標為start開始到end-1(end前面)的字串儲存在dest中(下標從0開始)*/
- void substring(char *dest,char *src,int start,int end)
- {
- int i=start;
- if(start>strlen(src))return;
- if(end>strlen(src))
- end=strlen(src);
- while(i<end)
- {
- dest[i-start]=src[i];
- i++;
- }
- dest[i-start]='\0';
- return;
- }
- /*返回src中下標為index的字元*/
- char charAt(char *src,int index)
- {
- char *p=src;
- int i=0;
- if(index<0||index>strlen(src))
- return 0;
- while(i<index)i++;
- return p[i];
- }
- /*返回str2第一次出現在str1中的位置(下表索引),不存在返回-1*/
- int indexOf(char *str1,char *str2)
- {
- char *p=str1;
- int i=0;
- p=strstr(str1,str2);
- if(p==NULL)
- return -1;
- else{
- while(str1!=p)
- {
- str1++;
- i++;
- }
- }
- return i;
- }
- /*返回str1中最後一次出現str2的位置(下標),不存在返回-1*/
- int lastIndexOf(char *str1,char *str2)
- {
- char *p=str1;
- int i=0,len=strlen(str2);
- p=strstr(str1,str2);
- if(p==NULL)return -1;
- while(p!=NULL)
- {
- for(;str1!=p;str1++)i++;
- p=p+len;
- p=strstr(p,str2);
- }
- return i;
- }
- /*刪除str左邊第一個非空白字元前面的空白字元(空格符和橫向定位字元)*/
- void ltrim(char *str)
- {
- int i=0,j,len=strlen(str);
- while(str[i]!='\0')
- {
- if(str[i]!=32&&str[i]!=9)break;/*32:空格,9:橫向定位字元*/
- i++;
- }
- if(i!=0)
- for(j=0;j<=len-i;j++)
- {
- str[j]=str[j+i];/*將後面的字元順勢前移,補充刪掉的空白位置*/
- }
- }
- /*刪除str最後一個非空白字元後面的所有空白字元(空格符和橫向定位字元)*/
- void rtrim(char *str)
- {
- char *p=str;
- int i=strlen(str)-1;
- while(i>=0)
- {
- if(p[i]!=32&&p[i]!=9)break;
- i--;
- }
- str[++i]='\0';
- }
- /*刪除str兩端的空白字元*/
- void trim(char *str)
- {
- ltrim(str);
- rtrim(str);
- }
儲存為mystr.c,另建立標頭檔mystr.h:
[cpp] view plaincopy
- extern void replaceFirst(char *str1,char *str2,char *str3);
- extern void replace(char *str1,char *str2,char *str3);
- extern void substring(char *dest,char *src,int start,int end);
- extern char charAt(char *src,int index);
- extern int indexOf(char *str1,char *str2);
- extern int lastIndexOf(char *str1,char *str2);
- extern void ltrim(char *str);
- extern void rtrim(char *str);
- extern void trim(char *str);
再寫個測試檔案test.c:
[cpp] view plaincopy
- #include <string.h>
- #include <stdio.h>
- #include "mystr.h"
- void main()
- {
- char buf[20]="012345126";
- char buf2[10];
-
- replaceFirst(buf,"12","9999");
- printf("replaceFirst:%s/n",buf);
- strcpy(buf,"012345126");
- replace(buf,"12","9999");
- printf("replace:%s/n",buf);
- strcpy(buf,"01234560");
- substring(buf2,buf,2,5);
- printf("substring:%s/n",buf2);
- printf("charAt:%c/n",charAt(buf,4));
- printf("indexOf:%d/n",indexOf(buf,"234"));
- printf("lastIndexOf:%d/n",lastIndexOf(buf,"0"));
- strcpy(buf," 0123 ");
- ltrim(buf);
- printf("ltrim:||%s||/n",buf);
- strcpy(buf," 0123 ");
- rtrim(buf);
- printf("rtrim:||%s||/n",buf);
- strcpy(buf," 0123 ");
- trim(buf);
- printf("trim:||%s||/n",buf);
- strcpy(buf," ");
- trim(buf);
- printf("trim2:||%s||/n",buf);
- }
在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:||||