[C/C++ 演算法]-純C 字串搜尋(尋找)與取代(替換)

[C/C++ 演算法]-純C 字串搜尋(尋找)與取代(替換)

[C/C++ 演算法]-C 字串搜尋(尋找)與取代(替換)

本篇要分享C 字串尋找與替換範例,有興趣的(C/P)同好,歡迎來(C/P)一下哈哈 ^ ^

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int main(){
   char* pchrsource = "My English Name Jash.liao";
   char pchrresult[1000];//char* pchrresult;
   char* pchrfind="Name";
   char* pchrrep="Name is";
   char* pchrformer;
   char* pchrlocation;
   int intrep;// 替換文字的長度
   int intfind;// 搜尋文字的長度
   int intlength;// 結果文字的長度
   int intgap=0;// 偏移量
 
   intfind=strlen(pchrfind);// 搜尋文字的長度
   intrep=strlen(pchrrep);// 替換文字的長度
   intlength=strlen(pchrsource)+1;// 結果文字的長度
 
   //pchrresult = (char*)malloc(sizeof(char) * intlength);// 配置記憶體
   strcpy(pchrresult, pchrsource);//複製文字
 
   pchrformer=pchrsource;
   pchrlocation= strstr(pchrformer, pchrfind);//搜尋文字出現的起始位址指標
 
   while(pchrlocation!=NULL){
 
       intgap+=(pchrlocation - pchrformer);//定位偏移量
       pchrresult[intgap]='\0';// 將結束符號定在搜尋到的位址上
 
       intlength+=(intrep-intfind);//計算新的長度
       //pchrresult = (char*)realloc(pchrresult, intlength * sizeof(char));// 變更記憶體空間
       strcat(pchrresult, pchrrep);//串接在結果後面
       intgap+=intrep;//更新偏移量
 
 
       pchrformer=pchrlocation+intfind;//更新尚未被取代的字串的位址
 
       strcat(pchrresult, pchrformer);//將尚未被取代的文字串接在結果後面
 
 
       pchrlocation= strstr(pchrformer, pchrfind);//搜尋文字出現的起始位址指標
   }
 
   pchrresult[strlen(pchrresult)]='\0';
 
   printf( "source: '%s'\n", pchrsource );
   printf( "result: '%s'\n", pchrresult);
 
   //free(pchrresult);
   return 0;
}

 

ps:本篇文章有兩種寫法(一種是先預設輸出字串長度,另一種是動態配置記憶體,如果是PC建議動態配置記憶體,但如果是Embedded則建議第一種方法)

2 thoughts on “[C/C++ 演算法]-純C 字串搜尋(尋找)與取代(替換)

  1. #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int replce_str(char* pchrsource,char* pchrfind,char* pchrrep)
    {
    char pchrresult[1000];//
    char* pchrformer;
    char* pchrlocation;
    int intrep;// 替換文字的長度
    int intfind;// 搜尋文字的長度
    int intlength;// 結果文字的長度
    int intgap=0;// 偏移量
    intfind=strlen(pchrfind);// 搜尋文字的長度
    intrep=strlen(pchrrep);// 替換文字的長度
    intlength=strlen(pchrsource)+1;// 結果文字的長度
    //pchrresult = (char*)malloc(sizeof(char) * intlength);// 配置記憶體
    strcpy(pchrresult, pchrsource);//複製文字
    pchrformer=pchrsource;
    pchrlocation= strstr(pchrformer, pchrfind);//搜尋文字出現的起始位址指標
    while(pchrlocation!=NULL){
    intgap+=(pchrlocation – pchrformer);//定位偏移量
    pchrresult[intgap]=’\0′;// 將結束符號定在搜尋到的位址上
    intlength+=(intrep-intfind);//計算新的長度
    //pchrresult = (char*)realloc(pchrresult, intlength * sizeof(char));// 變更記憶體空間
    strcat(pchrresult, pchrrep);//串接在結果後面
    intgap+=intrep;//更新偏移量
    pchrformer=pchrlocation+intfind;//更新尚未被取代的字串的位址
    strcat(pchrresult, pchrformer);//將尚未被取代的文字串接在結果後面
    pchrlocation= strstr(pchrformer, pchrfind);//搜尋文字出現的起始位址指標
    }
    pchrresult[strlen(pchrresult)]=’\0′;
    strcpy(pchrsource,pchrresult);
    //free(pchrresult);
    return 0;
    }
    int main(){
    char pchrsource[5000];
    char* pchrfind="Name";
    char* pchrrep="Name is";
    strcpy(pchrsource, "My English Name Jash.liao");
    printf( "source: ‘%s’\n", pchrsource );
    replce_str(pchrsource,pchrfind,pchrrep);
    printf( "source: ‘%s’\n", pchrsource );
    return 0;
    }

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *