作者loveme00835 (最愛朴素妍)
看板C_and_CPP
標題Re: [問題] replace的問題
時間Fri Nov 12 10:36:40 2010
※ 引述《jenny0514 (丫丫)》之銘言:
: char *replace(char *dest, char *source, int num) // str2取代str1的函數
: {
: //宣告變數
: char *ptr = dest;
: //找到輸入num在dest的位子
: while(*ptr++ != *(dest+num));
: ptr--;
: //從num的位子,複製字串source
: while((*ptr++=*source++) != '\0');
: return dest;
: }
while(*ptr++ != *(dest+num));
這行可以解讀成「ptr指到的內容不可以等於dest第num個字
元, 否則指向下一個字元」
當 dest = "yili" → dest[ 3 ] == 'i', 迴圈變成這樣
while(*ptr++ !=
'i');
這個演算法是錯的!
其實迴圈可以修改成這樣, (dest + num)指向第 num個字元
, ptr 加到跟他一樣為止
while(ptr != dest+num)
++ptr;
然後迴圈執行後 ptr == dest + num, 嗯...你做迴圈幹嘛?
修改後 replace 函式變成這樣 :
char *replace(
char *dest,
char *source,
int num)
{
//宣告變數
char *ptr = dest + num;
//從num的位子,複製字串source
while((*ptr++=*source++) !=
'\0')
;
return dest;
}
你可以用 debugger 找出來問題也是出在這, 但是你可能連
自己的演算法都不清楚, 就算逐步偵錯也不好發現它, 從結
構上來看, replace 有兩個工作 :
1.
找到 dest
第 num 個位置
2.
複製 source 到這個位置之後
想想看標準函式庫為什麼要提供 strlen、strcpy ? 把許多
功能組在一起雖然好用, 但是沒有寫成函式分開測試, 也是
不好偵錯的, 所以給你一個練習, 把 replace()改成這樣
char *replace(
char *dest,
char *source,
int num)
{
//宣告變數
char *ptr = dest + num;
//從num的位子,複製字串source
strCpy( ptr, source );
return dest;
}
測試完 strCpy() 確定沒問題後, 才開始寫 replace(), 因
為每個函式都是小小的, 發現問題你馬上就能知道是第幾行
有錯.
--
◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█
T-ara版怎麼去
████◤
██
◢██◣█
██
████
██
s ~>
T-ara
█/███
██
██
██
█/█ ◢█
██
█/█
歡迎您的光臨
████◤
██
██
██
██◤
███◤
██◤
恩靜、
智妍、
孝敏
█/███
██
█/█
█◤
██
█/██
██
素妍、
居麗、
寶藍
████◤
█◤
◥██◤ █◤
████◤
█◤
ψmakigoto123
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
※ 編輯: loveme00835 來自: 140.121.197.115 (11/12 10:53)
→ jenny0514:說的好詳細 謝謝你.看來我好像對字串.指標好像不太了解 11/12 11:36
推 xatier:推love大詳細解說 11/12 16:37