![](/img/trans.png)
[英]Does the scanf empty the buffer after reading the input data (in C)?
[英]How does the data flow from input stream into the input buffer during scanf() in C?
例如,當我執行scanf("%s",arg);
:Terminal允許我輸入文本,直到遇到換行符為止,但它最多只能存儲arg變量內的第一個空格字符。 其余部分保留在緩沖區中。
scanf("%c", arg);
:在這種情況下,它也允許我在終端中輸入文本,直到輸入換行符為止,但是只有一個存儲在arg中,其余的保留在緩沖區中。
scanf("%[^P]", arg)
; :在這種情況下,即使給了換行符,我也可以在終端中輸入文本,直到我打中帶有'P'的行並按Enter鍵(換行符),然后將所有內容傳輸到輸入緩沖區。
如何確定一次要從輸入流中將多少數據傳輸到輸入緩沖區?
假設arg
是正確的類型。
我的理解似乎根本上是錯誤的。 如果有人可以解釋這個問題,我將非常感謝。
如何確定? 它由格式字符串本身確定。
scanf
函數將讀取項目,直到它們不再與給定的格式說明符匹配為止。 然后停止,將第一個“不兼容”字符保留在緩沖區中。
如果您的意思是“如何在后台進行處理?”,那就是另一回事了。
我對此的第一反應是“沒關系”。 ISO標准規定了語言的工作方式,並描述了能夠做到這一點的“虛擬機”。 只要您遵循機器規則,就不必擔心幕后情況如何。
我的第二個答案可能更令人滿意,但非常依賴於實現。
為了提高效率,底層軟件可能要等到完整行后才能向實現交付任何數據(盡管這很可能是可配置的,例如為終端設置原始模式)。 這意味着諸如退格之類的操作可能會更改已輸入的字符,而不是將其插入流中。
它可能(例如使用GNU readline()
庫,允許在交付字符之前在行上進行各種真正有趣的編輯。沒有什么可以阻止基礎軟件甚至打開vim
會話來允許您輸入數據的,退出后將其交付:-)
緩沖區和原始編輯功能由操作系統提供。 如果您可以將終端設置為“原始模式”,則會看到不同的行為。
例如:在按下Enter鍵之前,可能可以讀取字符,特別是如果還可以禁用緩沖區。
我認為,它與格式說明符告訴how much
無關。
根據C99
第7.19.6.2章第2段(對於fscanf()
)
fscanf函數在由格式所指向的字符串的控制下,從該流所指向的流中讀取輸入,該格式指定了允許的輸入序列以及如何將其轉換為賦值,使用后續參數作為指向對象的指針以接收轉換后的對象輸入。
對於格式說明符,您需要參考第12段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.