[問題] 關於 while((fgets(buf,5,stdin)!=NULL))的問題

看板C_and_CPP作者 (杰克)時間15年前 (2010/09/29 15:56), 編輯推噓7(7011)
留言18則, 7人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) while((fgets(buf,5,stdin)!=NULL)) { t=strcmp(buf,"aaaa\0"); if(t==0) printf("found and t=%d\n",t); else printf("not found and t=%d\n",t); } 以上為我有問題的迴圈,當我輸入aaaa時,我發現buf會存入aaaa\0,所以第 一輪的比對會正確顯示,但我發現我輸入aaaa按下enter後,buf似乎會存下別的 字元給她做第二輪的判斷。 因此造成一個問題是,當我輸入正確的字串,aaaa的情況下,出來的結果會如下: found and t=0 not found and t=-1 判隨著第二行的出現 希望得到的正確結果: 請問要如何解決這個問題 在使用strcmp函式的情況下 程式跑出來的錯誤結果: 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) Dev-C++ 有問題的code: (請善用置底文標色功能) 補充說明: -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.84.27.29

09/29 16:04, , 1F
我猜是你按的那個enter存了\n這個字元進去
09/29 16:04, 1F

09/29 16:04, , 2F
輸入按下 enter 後,下一次會吃到 new line..
09/29 16:04, 2F

09/29 16:08, , 3F
試試loop 最底下加上 fflush(stdin); 我測是可以的
09/29 16:08, 3F

09/29 16:20, , 4F
ZeroMemory(buf,5);不知道有沒有用
09/29 16:20, 4F

09/29 19:49, , 5F
千萬別 fflush(stdin) 上次有人...(被打
09/29 19:49, 5F

09/29 19:52, , 6F
咳, 其實只要你檢查到如果 buf 裡只有一個 \n 就跳過即可
09/29 19:52, 6F

09/29 19:52, , 7F
原因正是一樓所說的
09/29 19:52, 7F

09/29 20:21, , 8F
= =" 我用了被唸很久...
09/29 20:21, 8F

09/29 20:32, , 9F
fgetc 抓出來檢查, 遇到非換行字元再用 ungetc 放回去
09/29 20:32, 9F

09/29 21:40, , 10F
why? 為什麼不能用 fflush ??
09/29 21:40, 10F

09/29 21:42, , 11F
fflush是拿來沖output不是拿來沖input的
09/29 21:42, 11F

09/29 21:47, , 12F
那就神奇了,這個例子我加進去後竟然不會有上述情形 XD
09/29 21:47, 12F

09/29 22:05, , 13F
fflush沖input不是標準 不代表這樣做沒功能
09/29 22:05, 13F

09/29 22:09, , 14F
有一份管很多的文件 ISO/IEC 9899,第七章 Library 的
09/29 22:09, 14F

09/29 22:09, , 15F
7.19.5.2 The fflush 函數,說不是 output 方面的話
09/29 22:09, 15F

09/29 22:10, , 16F
就給你貼小標籤,蓋章說你是未定義行為
09/29 22:10, 16F

09/29 22:14, , 17F
XD 從那次之後都會養成先查規格書的好習慣了
09/29 22:14, 17F

09/30 00:26, , 18F
= = 原來如此..話說看到編號就覺得spec是可怕的文件
09/30 00:26, 18F
文章代碼(AID): #1Cel4JhT (C_and_CPP)