C语言实现字符串的查找和替换
? ? 常用字處理軟件或者編輯器都提供字符串的查找和替換功能,本文描述如何借助C語言的字符串處理函數來實現字符串的查找和替換功能。
? ? 先說查找,字符串的查找主要使用strstr函數,其原型為:char * strstr(char * str1, char * str2),函數的功能是在str1中查找str2,如果str2是str1的子串,則返回str2在str1中第一次出現的位置,否則返回空指針。
? ? str2可能在str1中出現多次,如果希望把所有的str2都找出來,調用一次strstr是不夠的,必須多次使用strstr函數,而且要不斷更新str1。用一個簡單例子來說明基本思路,在str1中查找the這個單詞, str1=“I will give you the book the day aftertomorrow.”, str2=“the”。第一次調用strstr函數:p = strstr(str1, str2),找到了第一個the,返回值是這個the的地址,即指針p指向字母t。接下來需要在第一個the后面的字符串(也就是剩余字符串)中尋找其它的the,所以我們要將str1更換為剩余字符串,然后再調用strstr函數,也就是說在剩余字符串中找第一個the。借助p來實現這個更換,把p移到the后面,用p作為剩余字符串的首地址,即 p=p+3; p= strstr(p, str2)。這次就找到了第二個the,p指向了第二個the中的字母t。循環這個過程,直到p為空指針,就可以找到所有的str2。
? ? 下面說替換,意思就是用另一個字符串str3來替換str1中所有的str2。替換過程和查找的過程可以合并在一起,在上面循環查找的過程中,每找到一個str2,就把它替換為str3,替換后移動指針p。替換的情況分好幾種:一種是str2和str3的長度相同,一種是str3比str2長,一種是str3比str2短。第一種情況比較簡單,直接使用strncpy函數就可以,后面兩種情況,都需要把str1中的元素進行移動。比如,在上面的例子中,str2=“the”,假設str3 =“this”,str3比str2長,為了有足夠的空間,每找到一個the,從the后面的字符開始到結尾的‘\0’都要往后移動1個字節,也就是給this騰出4個字節的地方來(the的3個字節加移出來的1個字節)。假設str3 =“ok”,str3比str2短,為了填補空缺,每找到一個the,從the后面的字符開始到結尾的‘\0’都要往前移動1個字節,也就是給ok留出兩個字節的地方就夠了。移動過后,使用strncpy函數把str3拷貝到str2所在的地方。下面的程序中,str_replace就是用來實現替換功能的。
#include "string.h" #include "stdio.h"void str_replace(char * cp, int n, char * str) {int lenofstr;int i;char * tmp;lenofstr = strlen(str); //str3比str2短,往前移動 if(lenofstr < n) {tmp = cp+n;while(*tmp){*(tmp-(n-lenofstr)) = *tmp; //n-lenofstr是移動的距離 tmp++;}*(tmp-(n-lenofstr)) = *tmp; //move '\0' }else//str3比str2長,往后移動if(lenofstr > n){tmp = cp;while(*tmp) tmp++;while(tmp>=cp+n){*(tmp+(lenofstr-n)) = *tmp;tmp--;} }strncpy(cp,str,lenofstr); }int main() {char str1[1024]; char str2[100],str3[100]; int i,len,count=0;char c;char *p; printf("\n請輸入要查找的字符串和用于替換的字符串(中間用空格隔開): ");scanf("%s",str2);scanf("%s",str3);//read string from news.txtfreopen("news.txt","r",stdin);i=0;c = getchar();while(c!=EOF){str1[i] = c;i++;c = getchar();}str1[i] = '\0';//開始查找字符串str2 p = strstr(str1,str2);while(p){count++;//每找到一個str2,就用str3來替換 str_replace(p,strlen(str2),str3);p = p+strlen(str3);p = strstr(p,str2);} printf("\ncount = %d\n",count); printf("Result = %s\n",str1); }
? ? 字符串str1來自于文本文件news.txt文件,如圖1所示:
圖1. News.txt文件
?
? ? 運行時輸入str2和str3,運行結果如圖2所示:
圖2. 運行結果
?
??? 當然,輸出結果也可以寫入文件中保存。
總結
以上是生活随笔為你收集整理的C语言实现字符串的查找和替换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于PBOC的电子钱包消费交易过程
- 下一篇: 2020-11-03Paderborn大