1、C語言中沒有提供字符串替換函數(shù),網(wǎng)上能找到的類似函數(shù)也只是能替換一個,不能替換全部,工作中卻常常要用到這個功能,故實現(xiàn)一個函數(shù)。該函數(shù)所使用到的相關(guān)函數(shù)均是自己實現(xiàn),沒有調(diào)用庫函數(shù)。
成都網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)公司、微信開發(fā)、小程序設(shè)計、集團成都定制網(wǎng)頁設(shè)計等服務(wù)項目。核心團隊均擁有互聯(lián)網(wǎng)行業(yè)多年經(jīng)驗,服務(wù)眾多知名企業(yè)客戶;涵蓋的客戶類型包括:成都公路鉆孔機等眾多領(lǐng)域,積累了大量豐富的經(jīng)驗,同時也獲得了客戶的一致贊美!
2、函數(shù)代碼如下:
/*descript:replace?str,返回一個替換以后的字符串,用完之后要free()
success:return?1
error:return?0
BUG:"select?*?from?tab?where?id=':a'?and?name?=':aa'",this?is?not?support,this?function?is?just?simple?str_replace?,not?support?all?SQL?language
*/
char?*replacestr(char?*strbuf,?char?*sstr,?char?*dstr)
{???????char?*p,*p1;
int?len;
if?((strbuf?==?NULL)||(sstr?==?NULL)||(dstr?==?NULL))
return?NULL;
p?=?strstr(strbuf,?sstr);???????//返回字符串第一次出現(xiàn)的地址,否則返回NULL
if?(p?==?NULL)??/*not?found*/
return?NULL;
len?=?strlen(strbuf)?+?strlen(dstr)?-?strlen(sstr);
p1?=?malloc(len);
bzero(p1,?len);
strncpy(p1,?strbuf,?p-strbuf);
strcat(p1,?dstr);
p?+=?strlen(sstr);
strcat(p1,?p);
return?p1;
}
1、首先輸入代碼:
#include string.h
#include stdio.h
/**
* 參數(shù):
* originalString[] :原始字符串
* key[] : 待替換的字符串
* swap[] : 新字符串
*/
void replace(char originalString[], char key[], char swap[]){
int lengthOfOriginalString, lengthOfKey, lengthOfSwap, i, j , flag;
char tmp[1000];
2、然后輸入:
//獲取各個字符串的長度
lengthOfOriginalString = strlen(originalString);
lengthOfKey = strlen(key);
lengthOfSwap = strlen(swap);
for( i = 0; i = lengthOfOriginalString - lengthOfKey; i++){
flag = 1;
//搜索key
for(j? = 0; j lengthOfKey; j ++){
if(originalString[i + j] != key[j]){
flag = 0;
break;
}
}
3、然后輸入:
//如果搜索成功,則進行替換
if(flag){
strcpy(tmp, originalString);
strcpy(tmp[i], swap);
strcpy(tmp[i + lengthOfSwap], originalString[i? + lengthOfKey]);
strcpy(originalString, tmp);
i += lengthOfSwap - 1;
lengthOfOriginalString = strlen(originalString);
}
}
}
4、然后輸入:
/**
* main function
*/
int main(){
char originalString[1000] = {"abcfffffabcfffffabcfffff"};
char key[] = {"abc"};
char swap[] = {"aabbcc"};
replace(originalString, key, swap);
printf("%s\n", originalString);
return 0;
}
5、這樣就完成了。
/*功能:將str字符串中的oldstr字符串替換為newstr字符串
*參數(shù):str:操作目標(biāo)oldstr:被替換者newstr:替換者
*返回值:返回替換之后的字符串
*版本:V0.2
*/
char*strrpc(char*str,char*oldstr,char*newstr){
char bstr[strlen(str)];//轉(zhuǎn)換緩沖區(qū)
memset(bstr,0,sizeof(bstr));
for(int i=0;ilt;strlen(str);i++){
if(!strncmp(str+i,oldstr,strlen(oldstr))){//查找目標(biāo)字符串
strcat(bstr,newstr);
i+=strlen(oldstr)-1;
}else{
strncat(bstr,str+i,1);//保存一字節(jié)進緩沖區(qū)
}
}
strcpy(str,bstr);
return str;
}
擴展資料:
c_str函數(shù)的返回值是constchar*的,不能直接賦值給char*,所以就需要我們進行相應(yīng)的操作轉(zhuǎn)化,下面就是這一轉(zhuǎn)化過程。
c++語言提供了兩種字符串實現(xiàn),其中較原始的一種只是字符串的c語言實現(xiàn)。與C語言的其他部分一樣,它在c++的所有實現(xiàn)中可用,我們將這種實現(xiàn)提供的字符串對象,歸為c-串,每個c-串char*類型的。
標(biāo)準(zhǔn)頭文件lt;cstringgt;包含操作c-串的函數(shù)庫。這些庫函數(shù)表達了我們希望使用的幾乎每種字符串操作。
當(dāng)調(diào)用庫函數(shù),客戶程序提供的是string類型參數(shù),而庫函數(shù)內(nèi)部實現(xiàn)用的是c-串,因此需要將string對象,轉(zhuǎn)化為char*對象,而c_str()提供了這樣一種方法,它返回const char*類型(可讀不可改)的指向字符數(shù)組的指針。例:
#includelt;iostreamgt;
//#includelt;cstringgt;
#includelt;stringgt;//使用頭文件string,否則最后coutlt;lt;無法輸出add_to
using namespace std;
int main()
{
string add_to="hello!";
const string add_on="baby";
const char*cfirst=add_to.c_str();
const char*csecond=add_on.c_str();
char*copy=new char[strlen(cfirst)+strlen(csecond)+1];
strcpy(copy,cfirst);
strcat(copy,csecond);
add_to=copy;
coutlt;lt;"copy:"lt;lt;copylt;lt;endl;
delete[]copy;
coutlt;lt;"add_to:"lt;lt;add_tolt;lt;endl;
return 0;
}
例(1)
函數(shù)聲明:const char*c_str();
c_str()函數(shù)返回一個指向正規(guī)C字符串的指針,內(nèi)容與本string串相同.
這是為了與c語言兼容,在c語言中沒有string類型,故必須通過string類對象的成員函數(shù)c_str()把string對象轉(zhuǎn)換成c中的字符串樣式。
注意:一定要使用strcpy()函數(shù)等來操作方法c_str()返回的指針
比如:最好不要這樣:
char*c;
string s="1234";
c=s.c_str();
//c最后指向的內(nèi)容是垃圾,因為s對象被析構(gòu),其內(nèi)容被處理(糾正:s對象的析構(gòu)是在s的生命周期結(jié)束時,例如函數(shù)的返回)
參考資料:
百度百科——c_str