C語(yǔ)言實(shí)現(xiàn)字符串替換的示例代碼
替換,意思就是用另一個(gè)字符串str3來(lái)替換str1中所有的str2。替換過(guò)程和查找的過(guò)程可以合并在一起,在上面循環(huán)查找的過(guò)程中,每找到一個(gè)str2,就把它替換為str3,替換后移動(dòng)指針p。替換的情況分好幾種:一種是str2和str3的長(zhǎng)度相同,一種是str3比str2長(zhǎng),一種是str3比str2短。第一種情況比較簡(jiǎn)單,直接使用strncpy函數(shù)就可以,后面兩種情況,都需要把str1中的元素進(jìn)行移動(dòng)。比如,在上面的例子中,str2=“the”,假設(shè)str3 =“this”,str3比str2長(zhǎng),為了有足夠的空間,每找到一個(gè)the,從the后面的字符開始到結(jié)尾的‘\0’都要往后移動(dòng)1個(gè)字節(jié),也就是給this騰出4個(gè)字節(jié)的地方來(lái)(the的3個(gè)字節(jié)加移出來(lái)的1個(gè)字節(jié))。假設(shè)str3 =“ok”,str3比str2短,為了填補(bǔ)空缺,每找到一個(gè)the,從the后面的字符開始到結(jié)尾的‘\0’都要往前移動(dòng)1個(gè)字節(jié),也就是給ok留出兩個(gè)字節(jié)的地方就夠了。移動(dòng)過(guò)后,使用strncpy函數(shù)把str3拷貝到str2所在的地方。下面的程序中,str_replace就是用來(lái)實(shí)現(xiàn)替換功能的。
關(guān)鍵點(diǎn):
注意字符數(shù)組與字符串的區(qū)別;在字符數(shù)組最后一個(gè)字符后面加上’\0’就構(gòu)成了一個(gè)字符串。
/*------------------------------------------------- 功能:實(shí)現(xiàn)字符串的替換 描述:第一行輸入原字符串,第二行輸入要替換字符串, 第三行輸入新的字符串 輸入示例: There is an orange, do you want to eat it? orange apple 輸出示例: There is an apple, do you want to eat it? Author: Zhang Kaizhou Date: 2019-8-9 11:11:32 --------------------------------------------------*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 300 void str_replace(char * str1, char * str2, char * str3); int main(){ ? ? char str1[MAXSIZE]; ? ? char str2[MAXSIZE]; ? ? char str3[MAXSIZE]; ? ? gets(str1); ? ? gets(str2); ? ? gets(str3); ? ? str_replace(str1, str2, str3); ? ? puts(str1); ? ? return 0; } void str_replace(char * str1, char * str2, char * str3){ ? ? int i, j, k, done, count = 0, gap = 0; ? ? char temp[MAXSIZE]; ? ? for(i = 0; i < strlen(str1); i += gap){ ? ? ? ? if(str1[i] == str2[0]){ ? ? ? ? ? ? done = 0; ? ? ? ? ? ? for(j = i, k = 0; k < strlen(str2); j++, k++){ ? ? ? ? ? ? ? ? if(str1[j] != str2[k]){ ? ? ? ? ? ? ? ? ? ? done = 1; ? ? ? ? ? ? ? ? ? ? gap = k; ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? if(done == 0){ // 已找到待替換字符串并替換 ? ? ? ? ? ? ? ? for(j = i + strlen(str2), k = 0; j < strlen(str1); j++, k++){ // 保存原字符串中剩余的字符 ? ? ? ? ? ? ? ? ? ? temp[k] = str1[j]; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? temp[k] = '\0'; // 將字符數(shù)組變成字符串 ? ? ? ? ? ? ? ? for(j = i, k = 0; k < strlen(str3); j++, k++){ // 字符串替換 ? ? ? ? ? ? ? ? ? ? str1[j] = str3[k]; ? ? ? ? ? ? ? ? ? ? count++; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? for(k = 0; k < strlen(temp); j++, k++){ // 剩余字符串回接 ? ? ? ? ? ? ? ? ? ? str1[j] = temp[k]; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? str1[j] = '\0'; // 將字符數(shù)組變成字符串 ? ? ? ? ? ? ? ? gap = strlen(str2); ? ? ? ? ? ? } ? ? ? ? }else{ ? ? ? ? ? ? gap = 1; ? ? ? ? } ? ? } ? ? if(count == 0){ ? ? ? ? printf("Can't find the replaced string!\n"); ? ? } ? ? return; }
到此這篇關(guān)于C語(yǔ)言實(shí)現(xiàn)字符串替換的示例代碼的文章就介紹到這了,更多相關(guān)C語(yǔ)言 字符串替換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++各種數(shù)據(jù)類型所占內(nèi)存大小詳解
這篇文章主要介紹了C++各種數(shù)據(jù)類型所占內(nèi)存大小,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08matlab遺傳算法求解車間調(diào)度問題分析及實(shí)現(xiàn)源碼
這篇文章主要為大家介紹了matlab遺傳算法求解車間調(diào)度問題解析,文中附含詳細(xì)實(shí)現(xiàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02C語(yǔ)言實(shí)現(xiàn)電影院選座管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電影院選座管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12C語(yǔ)言通過(guò)深度優(yōu)先搜索來(lái)解電梯問題和N皇后問題的示例
深度優(yōu)先搜索即是對(duì)一個(gè)新發(fā)現(xiàn)的節(jié)點(diǎn)上如果還關(guān)聯(lián)未探測(cè)到的邊,就沿此邊探測(cè)下去,直到發(fā)現(xiàn)從原點(diǎn)可達(dá)的所有點(diǎn)為止,這里我們就來(lái)展示C語(yǔ)言通過(guò)深度優(yōu)先搜索來(lái)解電梯問題和N皇后問題的示例2016-06-06通過(guò)代碼實(shí)例解析c++ vector常用方法
這篇文章主要介紹了通過(guò)代碼實(shí)例解析c++ vector常用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07C++實(shí)現(xiàn)LeetCode(228.總結(jié)區(qū)間)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(228.總結(jié)區(qū)間),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07淺談Qt實(shí)現(xiàn)HTTP的Get/Post請(qǐng)求
本文主要介紹了淺談Qt實(shí)現(xiàn)HTTP的Get/Post請(qǐng)求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05