[問題] 老手了卻還是不懂scanf

看板C_and_CPP作者 (丁丁)時間16年前 (2009/12/13 16:42), 編輯推噓6(608)
留言14則, 11人參與, 最新討論串1/2 (看更多)
http://blog.yam.com/gookaa/article/3473147 這個網站說如果用完scanf 要清空緩衝區,可以用: scanf("%d",&a); while(getche() != '/n'); 我的測試code長這樣: ( http://codepad.org/7ns9mHdO ) #include <iostream> #include<conio.h> using namespace std; int main() { int a; char ch[6],tmp; memset(&ch,'*',6); scanf("99%c",&ch); //while(getche()!='\n'); for(int i=0;i<6;i++) { printf("%d:\'%c\'\n",i,ch[i]); } cout<<ch<<'\n'; while(tmp=getchar()) { printf("\'%c\'",tmp); } scanf("88%c",&ch); cout<<'\n'; for(int i=0;i<6;i++) { printf("%d:\'%c\'\n",i,ch[i]); } system("pause"); return 0; } ========================================== 執行第10行scanf("99%c",&ch);時,我故意輸入"88o",這時根據cplusplus文件 (http://www.cplusplus.com/reference/clibrary/cstdio/scanf/) 預設讀到99%c,實際讀到88o,第一個字元不符合,便離開這個scanf,而"88o"就進入 緩衝區裡面。 12~15行我把ch字元陣列的元素個個印出來。 16行輸入"整個ch"字元陣列,理論上會輸出"******",但用codeblocks卻輸出"******@" (奇怪的是,同樣的原始碼用dev C++,就只輸出"******") 16行接著再輸出"(char)10",根據ASCII表(http://tinyurl.com/y9o4bp8), 10為換行 18行,理論上會清空緩衝區(雖然我不曉得為什麼會這樣),但實際上卻一直停留在這一行 ,一直讓我們輸入,卻無法進入下一行的 cout<<"in scanf:\n"; 用了這麼久scanf,但真的來研究的時候,卻發現自己懂的好少。 有大神精通scanf的嗎?或是透漏一下有什麼說明清楚的文件可以看。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.230.240

12/13 16:46, , 1F
不是fflush(stdin) 嗎?
12/13 16:46, 1F

12/13 16:52, , 2F
樓上的不對....
12/13 16:52, 2F

12/13 16:53, , 3F
原PO的問題 理論上18行讀完了 但他不知道已經讀完了...
12/13 16:53, 3F

12/13 16:53, , 4F
第一個網頁裡說fflush(stdin)有時會失靈耶
12/13 16:53, 4F

12/13 16:54, , 5F
16行的問題 你這樣輸出是當 C string 來輸出 要有 '\0'
12/13 16:54, 5F

12/13 16:56, , 6F
fflush是給output stream用的
12/13 16:56, 6F

12/13 17:13, , 7F
老手,呃...你應該改去用GUI,跟scanf說永別了
12/13 17:13, 7F

12/13 17:46, , 8F
嗯,跟G不GUI沒有關係...
12/13 17:46, 8F

12/13 17:53, , 9F
跟手老不老也無關啊~~~ (看手紋
12/13 17:53, 9F

12/13 19:00, , 10F
樓上不好笑喔~~~
12/13 19:00, 10F

12/13 22:28, , 11F
scanf("99%c", &ch); 是啥呀 ? @____@!
12/13 22:28, 11F

12/13 22:28, , 12F
喔喔我看到了 ... 你要 match ... orz
12/13 22:28, 12F

12/14 13:23, , 13F
fflush(stdin)在unix環境下回無效
12/14 13:23, 13F

12/18 02:16, , 14F
這跟什麼環境沒關係?是未定義的行為吧
12/18 02:16, 14F
文章代碼(AID): #1B9AZcIL (C_and_CPP)
文章代碼(AID): #1B9AZcIL (C_and_CPP)