看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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