[英]Why doesn't tcflush work for scanf?
我有這個簡單的代碼接受3個字符,:
char a,b,c;
scanf("%c",&a);
scanf("%c",&b);
scanf("%c",&c);
printf("%c",a);
printf("%c",b);
printf("%c",c);
我明白為什么這只會接受2個字符,因為第二個scanf接受回車。 但是如果使用__fpurge(stdin);
在每個scanf之間,代碼按預期工作。 但如果我使用read(STDIN_FILENO,&a,1);
而不是scanf,它不起作用。 對於read()
,只有tcflush(STDIN_FILENO,TCIOFLUSH);
有效,但它與scanf失敗。 有人能解釋一下為什么嗎?
fpurge
將緩沖區清空為C級,即scanf
工作級別。
tcflush
在較低級別(系統級別)執行,這是read
工作的級別。
scanf
使用read
來填充自己的緩沖區。
所以在第一種情況下:使用scanf
清空C緩沖區效果很好,但在系統級別沒有任何作用。
在第二種情況下,清空系統緩沖區當然可以使用read
而不是scanf
因為當你使用scanf
,至少在回車符中的數據已經存在於C緩沖區中。 第一個scanf
,讀取大量數據,將它們放入緩沖區,然后使用該緩沖區返回一個char。 然后你tcflush
刷新系統級緩沖區但對C緩沖區什么都不做,所以下面的scanf
能夠在其中找到回車符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.