亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請指教一下,下面這個代碼我想得出如:輸入"thios"回車,再輸入"o",回車得出"this",但是

請指教一下,下面這個代碼我想得出如:輸入"thios"回車,再輸入"o",回車得出"this",但是

C C++
什么鬼_呀你 2017-05-10 07:14:51
請指教一下,下面這個代碼我想得出如:輸入"thios"回車,再輸入"o",回車得出"this",但是不知道哪里出問題了? #include"stdio.h" main() { extern enter_string(),delete_string(),print_string(); static char str[80]; char c; enter_string(str); scanf("%c",&c); delete_string(str,c); print_string(str); } extern enter_string(str) char str[80]; { gets(str); } extern delete_string(str,ch) char str[],ch; { int i,j; for(i=j=0;str[i]!='\0';i++) if(str[i]!=ch) str[j++]=str[i]; str[i]='\0'; } extern print_string(str) char str[]; { printf("%s",str); }
查看完整描述

3 回答

已采納
?
onemoo

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)。

查看完整回答
反對 回復 2017-05-10
  • 什么鬼_呀你
    什么鬼_呀你
    呃,謝謝,自學的,?_? ...心塞!跟不上時代
  • onemoo
    onemoo
    沒關系。如果你真想學C語言,我推薦你看些更現代些的教程。這里太擠了,我另寫一個回答吧。
  • 什么鬼_呀你
    什么鬼_呀你
    雖然才看見,但是謝謝了!
  • 3 回答
  • 1 關注
  • 1812 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號