作者bil193 (丁丁)
看板C_and_CPP
標題[問題] 老手了卻還是不懂scanf
時間Sun Dec 13 16:42:11 2009
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