簡體   English   中英

在C語言中的scanf()過程中,數據如何從輸入流流入輸入緩沖區?

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

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