3 回答

TA貢獻883條經驗 獲得超454個贊
先吐槽:發代碼時一定要用網頁中的格式化工具格式化一下,不然這么亂一坨很少有人愿意看的...
錯誤點在?delete_string() 函數中最后的?str[i]='\0';,應該是?str[j]='\0';
因為 i 表示的是原字符串的結尾,在 for 循環退出時 i 所指的就是原字符串結尾的 \0,而 j 才是指向改寫后的字符串結尾,所以應該在 j 位置上寫入 \0。
否則你那樣寫的話,等于原字符串結尾位置沒有變。所以即便 s 覆蓋了前面的 o,最后還會按照原字符串的長度輸出 thiss,沒錯吧?
再次吐槽:
這個代碼看著真有滄桑感??! ?代碼風格比 C89 K&R 還老…… 你到底看的是哪個年代的教程啊?!
現在學習C/C++語言最好按照新標準來學,太老的代碼除了“經典”外還包含了很多現在視為錯誤和不推薦的寫法,已經不適合用來學習了!
你這樣的 main 函數應該聲明為 int main(void),不要省略前面的 int 及括號中的 void(這是在你不使用main參數的情況下)
其實函數聲明時缺少返回類型,編譯器會隱式認為其返回類型是 int,這是在老標準中常用的,現在不推薦這樣寫了。
聲明/定義函數時參數名和參數類型都要寫在參數列表的括號中。你這樣將參數類型寫在函數體前、函數名后的風格比 C89 還要老……
定義函數時同樣不要忘記明確寫上返回類型,而且不用在函數定義前寫 extern。
其實你可以把這幾個函數定義在 main 函數之前,這樣也就不用前置聲明它們了(即便是前置聲明也沒必要寫extern)。
- 3 回答
- 1 關注
- 1812 瀏覽
添加回答
舉報