[英]C - How scanf inputs work and how it iterates in loops?
我知道 scanf() 的基礎知識; 需要轉換說明符 % 和變量地址來存儲輸入值 &。
在進行分配時,有一項任務涉及輸入任意數量的值,例如:5 4 3 2 1
進入scanf,然后打印出integer類型對應的符號數(例如'?'),所以終端顯示為:
5 4 3 2 1
?????
????
???
??
?
在這種情況下,我將 scanf 置於 while 循環中,如下所示:
int i, num;
while(scanf("%d",&num)==1){
printf("%d",num);
for (i=0; i<num; i++){
printf("?");
}
printf("/n");
}
當許多來源指定 scanf 只需要一個 integer 直到它讀取一個空格時,我完全混淆了 scanf 如何在一個輸入行(5 4 3 2 1)中讀取多個整數。 從這個角度來看,我的理解是分隔整數的空格表示在之前的 integer 之后的新迭代? 當我試圖追蹤打印的工作原理時,它打印為:
5 4 3 2 1
5?????
4????
3???
2??
1?
...所以我的問題是 scanf 如何將所有這些整數在一行中“保存”到“num”並將每個相應的符號打印到輸入后給定的值? 如果沒有數組,整數不會替換變量中的前一個嗎?
抱歉,如果這個問題沒有意義 - 對編碼來說還是很新的。 謝謝!
你對scanf
的理解是對的,scanf 只需要一個 integer 直到它讀取一個空格。
在這里讓你感到困惑的是算法是如何工作的。 您的算法首先讀取 integer 5 並“立即”打印 5 ?
. 它繼續讀 4,打印 4 ?
, 讀 3, 打印 3 ?
, 等等。
scanf
將行存儲在內部緩沖區中。 如果緩沖區不為空,則嘗試從緩沖區中讀取並刪除成功讀取的部分; 如果緩沖區為空,則等待用戶輸入。 在外循環( while
)的第一次迭代中,緩沖區是空的。 您輸入“5 4 3 2 1”,因此緩沖區包含它。 第一個sscanf("%d",&num)
從緩沖區中讀取第一個 integer,即 5; 緩沖區現在包含“4 3 2 1”。 在第二次迭代中,您讀取 4,緩沖區將為“3 2 1”。 這種情況一直持續到緩沖區用完為止。 此時您的程序繼續; 它只是等待更多的輸入。
scanf
從標准輸入stdin
標准輸入中“讀取”字符(如果還沒有任何內容,它會提示用戶輸入要添加的內容),並將它們轉換為取決於格式字符串中使用的轉換說明符的格式。
您可以將stdin
視為 memory 中的字符序列,每次用戶在終端中鍵入內容並按 Enter 時,鍵入的內容都會添加到stdin
。
因此,在您的情況下,當您在終端中鍵入5 4 3 2 1
並按 Enter 時, stdin
將收到字符序列"5 4 3 2 1\n"
(請注意,當您按 Enter 時添加了換行符) .
然后scanf("%d",&num)
,它只需要 1 個十進制 integer 數字,從標准輸入中“讀取”和“消耗”形成一個連續十進制stdin
數字的相關字符。
在這種情況下,第一次執行scanf
時會讀取5
,並將" 4 3 2 1\n"
留在stdin
中。 然后在滿足條件時執行循環語句。 第二次執行scanf
時,前導空格被%d
說明符丟棄並讀取4
,在stdin
中留下" 3 2 1\n"
。 依此類推,直到無法從stdin
中讀取十進制整數...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.