簡體   English   中英

為什么tcflush不能用於scanf?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM