簡體   English   中英

C - scanf 輸入如何工作以及它如何在循環中迭代?

[英]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() function 取值(假設包括空格)並將它們一一保存到變量num中。 如果您使用調試器(假設使用 GDB)並在while()中設置斷點,您將通過逐步了解變量num在每次迭代中更改並且for循環運行直到達到num來了解。

下面提供了使用調試器進行兩次迭代的示例(關注左角的num ):

迭代1:

迭代 1

迭代 2:

迭代 2

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.

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