看板 C_and_CPP 關於我們 聯絡資訊
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
liu2007:不是fflush(stdin) 嗎? 12/13 16:46
LPH66:樓上的不對.... 12/13 16:52
LPH66:原PO的問題 理論上18行讀完了 但他不知道已經讀完了... 12/13 16:53
bil193:第一個網頁裡說fflush(stdin)有時會失靈耶 12/13 16:53
LPH66:16行的問題 你這樣輸出是當 C string 來輸出 要有 '\0' 12/13 16:54
iamivers0n:fflush是給output stream用的 12/13 16:56
twotwoone:老手,呃...你應該改去用GUI,跟scanf說永別了 12/13 17:13
tomnelson:嗯,跟G不GUI沒有關係... 12/13 17:46
sunneo:跟手老不老也無關啊~~~ (看手紋 12/13 17:53
tiyun:樓上不好笑喔~~~ 12/13 19:00
ledia:scanf("99%c", &ch); 是啥呀 ? @____@! 12/13 22:28
ledia:喔喔我看到了 ... 你要 match ... orz 12/13 22:28
discipile:fflush(stdin)在unix環境下回無效 12/14 13:23
ikari512:這跟什麼環境沒關係?是未定義的行為吧 12/18 02:16