#include stdio.h
為朔城等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及朔城網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計、朔城網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
#define N 80
/* 請?jiān)谶@里填寫答案 */
void f(char *c,char a)
{
for(;*c;c++)
? if(*c='0'*c='9')
? ? ? *c=a;
}
int main(void)
{
char c[N], a;
gets(c);
scanf("%c", a);
f(c, a);
printf("%s", c);
return 0;
}
1、C語言中沒有提供字符串替換函數(shù),網(wǎng)上能找到的類似函數(shù)也只是能替換一個,不能替換全部,工作中卻常常要用到這個功能,故實(shí)現(xiàn)一個函數(shù)。該函數(shù)所使用到的相關(guān)函數(shù)均是自己實(shí)現(xiàn),沒有調(diào)用庫函數(shù)。
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;
}
A函數(shù)的源碼可控嗎?如果可控,把對B函數(shù)的調(diào)用改成對新實(shí)現(xiàn)的調(diào)用就行了。
如果A函數(shù)不是自己寫的(源碼不可控),會麻煩一些。例如,在支持指針的語言上,可以修改B函數(shù)入口部分的匯編代碼,jmp到自己的新實(shí)現(xiàn)。要求B函數(shù)和你的實(shí)現(xiàn)原型必須完全相同。
char
*replace(char
*source,
char
*sub,
char
*rep)
{
char
*result;
/*pc1
是復(fù)制到結(jié)果result掃描指針*/
/*pc2
是掃描
source
輔助指針*/
/*pc3
尋找子串時,為檢查變化中source是否和子串相等,是指向sub掃描指針
*/
/*找到匹配后,為了復(fù)制到結(jié)果串,是指向rep掃描指針*/
char
*pc1,
*pc2,
*pc3;
int
isource,
isub,
irep;
isub
=
strlen(sub);
/*對比串長度*/
irep
=
strlen(rep);
/*替換串長度*/
isource=
strlen(source);
/*源串長度*/
if(NULL==*sub)
return
strdup(source);
/*申請結(jié)果串需要空間*/
result
=
(char
*)malloc(((irepisub)?(float)strlen(source)/isub*irep+1:isource)*sizeof(char));
pc1
=
result;
/*為pc1依次復(fù)制結(jié)果串每個字節(jié)作準(zhǔn)備*/
while(*source
!=
NULL)
{
/*為檢查source和sub是否相等作準(zhǔn)備,為pc2,pc3
賦初值*/
pc2
=
source;
pc3
=
sub;
/*
出循環(huán)(任)條件是:
*
*pc2
不等于
*pc3
(和子串不相等)
*
pc2
到源串結(jié)尾
*
pc3
到源串結(jié)尾
(此時,檢查了全部子串,source處和sub相等)
*****************************************************/
while(*pc2==*pc3
*pc3
!=
NULL
*pc2
!=
NULL)
pc2++,
pc3;
/*
如果找到了子串,進(jìn)行以下處理工作*/
if(NULL==*pc3)
{
pc3
=
rep;
/*將替代串追加到結(jié)果串*/
while(*pc3
!=
NULL)
*pc1
=
*pc3;
pc2--;
source
=
pc2;
/*
檢查
source和sub相等循環(huán)結(jié)束后
*
pc2
對應(yīng)位置是在
sub
中串結(jié)束符處該是源串中下個位置
*
將
source
指向其前面?zhèn)€
***************************************************/
}
/*如果沒找到子串,下面復(fù)制source所指字節(jié)到結(jié)果串*/
*pc1
=
*source;
source;
/*
將source向后移個*/
}
*pc1
=
NULL;
result;
}
#include?"stdafx.h"
#include?stdio.h
#include?string.h
void?replaceChar(char?*string,?char?oldChar,?char?newChar){
int?len?=?strlen(string);
int?i;
for?(i?=?0;?i??len;?i++){
if?(string[i]?==?oldChar){
string[i]?=?newChar;
}
}
}
int?main(){
char?str[]?=?"test";
char?oldChar?=?'t';
char?newChar?=?'w';?
replaceChar(str,?oldChar,?newChar);
printf("%s\n",?str);
return?0;
}
簡單來說:宏定義又稱為宏代換、宏替換,簡稱“宏”。宏替換是C/C++的預(yù)處理中的一部分,在C++標(biāo)準(zhǔn)中有4條規(guī)則來定義替換。
規(guī)則1:實(shí)參替換。
本條規(guī)則描述帶參數(shù)的宏的替換過程。
對于宏定義中的形參,在替換列表中,如果不是作為#或##的操作數(shù),那么將對應(yīng)實(shí)參完全
展開(相當(dāng)于對實(shí)參進(jìn)行求值),然后將替換列表中的形參替換掉.如果是#或##的操作數(shù),
那么不進(jìn)行替換。
規(guī)則2:多次掃描。
在所有的形參替換為實(shí)參后,對結(jié)果進(jìn)行再次掃描,如果發(fā)現(xiàn)還有可替換的宏,則進(jìn)行替換,
否則中止。
規(guī)則3:遞歸替換抑制。
如果在替換列表中發(fā)現(xiàn)當(dāng)前正在展開的宏的名字,那么這里不進(jìn)行替換.更進(jìn)一步,在嵌套
的替換過程中發(fā)現(xiàn)已經(jīng)替換過的宏的名字,則不進(jìn)行替換。
規(guī)則4:遞歸預(yù)處理抑制。
如果替換后的結(jié)果形成預(yù)處理指令,則不執(zhí)行這條預(yù)處理指令。
看幾個C++標(biāo)準(zhǔn)中的例子:
#define x 3
#define f(a) f(x * (a))
#undef x
#define x 2
#define g f
#define z z[0]
#define h g(~
#define m(a) a(w)
#define w 0,1
#define t(a) a
f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);
g(x+(3,4)-w) | h 5) m(f)^m(m);
其結(jié)果分別是
f(2 * (y+1)) + f(2 * (f(2 * (z[0])))) % f(2 * (0)) + t(1);
f(2 * (2+(3,4)-0,1)) | f(2 * ( ~ 5)) f(2 * (0,1))^m(0,1);
對于第一個,主要在于t(t(g)(0) + t)(1)的展開。
容易計算出最外層的t的實(shí)參是f(2 * (0)) + t,而作為t的參數(shù)傳入時其中的t是
正在被展開的宏,所以根據(jù)規(guī)則3,不對這個t進(jìn)行處理,保持不變,得到f(2 * (0)) + t(1)。
對于第二個,h 5)被替換為g(~5),應(yīng)用規(guī)則2,被替換為f(2 * ( ~ 5))。
而m(m)首先被替換為m(w),然后應(yīng)用規(guī)則2再次進(jìn)行替換,但是m已經(jīng)是替換過的了,所以保持
不變,只對w進(jìn)行替換。
#define str(s) # s
#define xstr(s) str(s)
#define debug(s, t) printf("x" # s "= %d, x" # t "= %s", \
x ## s, x ## t)
#define INCFILE(n) vers ## n /* from previous #include example */
#define glue(a, b) a ## b
#define xglue(a, b) glue(a, b)
#define HIGHLOW "hello"
#define LOW LOW ", world"
debug(1, 2);
fputs(str(strncmp("abc\0d", "abc", ’\4’) /* this goes away */
== 0) str(: @\n), s);
#include xstr(INCFILE(2).h)
glue(HIGH, LOW);
xglue(HIGH, LOW)
其結(jié)果分別是
printf("x" "1" "= %d, x" "2" "= %s", x1, x2);
fputs("strncmp(\"abc\\0d\", \"abc\", ’\\4’) = = 0" ": @\n", s);
#include "vers2.h"
"hello";
"hello" ", world"
關(guān)鍵是glue和xglue.
對于glue(HIGH, LOW),首先有一個規(guī)則1的抑制,得到HIGHLOW;的結(jié)果,然后二次掃描,得到
"hello";
對于xglue(HIGH, LOW)沒有抑制效果,所以對參數(shù)求值,分別得到HIGH和LOW ", world",即
glue(HIGH, LOW ", world")。
然后進(jìn)行連接操作得到HIGHLOW ", world",最后再掃描一次得到"hello" ", world"
如果考慮字符串的自然的連接,就可以得到"hello, world"了。
擴(kuò)展資料
宏語言是一類編程語言,其全部或多數(shù)計算是由擴(kuò)展宏完成的。宏語言并未在通用編程中廣泛使用,但在文本處理程序中應(yīng)用普遍。例如, C preprocessor C預(yù)處理器Internet Macros(iOpus) M4(如前所述,源于ATT,捆綁于Unix)
宏定義
c程序提供的預(yù)處理功能之一。包括帶參數(shù)的宏定義和不帶參數(shù)的宏定義。具體是指用一個指定的標(biāo)志符來進(jìn)行簡單的字符串替換或者進(jìn)行闡述替換。形式為:
#define標(biāo)志符[(參數(shù)表)] 字符串
宏名
在上定義中的標(biāo)志符被稱為“宏名”。
宏展開
在c程序編譯時將宏名替換成字符串的過程稱為“宏展開”。
宏語言是一類編程語言,其全部或多數(shù)計算是由擴(kuò)展宏完成的。宏語言并未在通用編程中廣泛使用, 但在文本處理程序中應(yīng)用普遍。例如,
C preprocessorC 預(yù)處理器
Internet Macros(iOpus)
M4(如前所述,源于ATT,捆綁于Unix)
參考資料來源:百度百科-宏
文章標(biāo)題:c語言函數(shù)的怎樣替換 c語言替換語句
鏈接URL:http://jinyejixie.com/article34/dosddpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、動態(tài)網(wǎng)站、建站公司、自適應(yīng)網(wǎng)站、做網(wǎng)站、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)