簡體   English   中英

scanf 是否在讀取輸入數據后清空緩沖區(在 C 中)?

[英]Does the scanf empty the buffer after reading the input data (in C)?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char buf[1024];
    int a,b;
    int i;
    
    setbuf(stdin, buf);
    scanf("%d %d", &a, &b);
    
    for(i=0; buf[i]!='\n'; i++){
        putchar(buf[i]);  
    }
    
    putchar('\n');

    return 0;
}

當我輸入值1 2時,我使用setbuf來確定在讀取這些值后緩沖區是否真的被清除了。
但是,當我打印出buf時,我輸入的值在buf中保持不變。 也就是說,output 是1 2

為什么會這樣?
如果您能回答,我將不勝感激。

以下是 C 標准對 function setbuf的描述:

7.21.5.5 setbuf function

概要

#include <stdio.h> void setbuf(FILE * restrict stream, char * restrict buf);

描述

除了不返回任何值外, setbuf function 等同於調用setvbuf function,調用時mode的值為_IOFBFsize的值為BUFSIZ ,或者(如果buf是 null 指針), mode的值為_IONBF

退貨
setbuf function 不返回任何值。

7.21.5.6 setvbuf function

概要

#include <stdio.h> int setvbuf(FILE * restrict stream, char * restrict buf, int mode, size_t size);

描述

setvbuf function 只能在 stream 指向的stream與打開的文件相關聯之后以及在對 stream 執行任何其他操作(對setvbuf的不成功調用除外)之前使用。參數mode決定了 stream 將如何被緩沖,如下: _IOFBF使輸入/輸出完全緩沖; _IOLBF導致輸入/輸出進行行緩沖; _IONBF導致輸入/輸出無緩沖。 如果buf不是 null 指針,則可以使用它指向的數組而不是setvbuf分配的緩沖區 function 277)並且參數size指定數組的大小; 否則, size可以確定setvbuf function 分配的緩沖區的大小。數組的內容在任何時候都是不確定的。

退貨

setvbuf function 在成功時返回零,如果為mode給出了無效值或請求無法兌現,則返回非零。


277) 緩沖區的生命周期必須至少與打開的 stream 一樣長,因此 stream 應該在塊退出時釋放具有自動存儲持續時間的緩沖區之前關閉。

它遵循:

  • 代碼中的數組buf的長度應為BUFSIZ ,可以不同於1024
  • 這個數組不應該有自動存儲 class 因為stdin在 function main返回之前沒有關閉。 它應該定義為static char buf[BUFSIZ];
  • 緩沖區可能會也可能不會被 stream 處理函數使用。
  • 數組的內容在任何時候都是不確定的,因此不能對緩沖區內容有任何期望:您觀察到用戶輸入存在,但這並不能保證。 大多數實現在FILE結構中都有指針或偏移量,以跟蹤緩沖區的已用和可用部分。
  • stream 處理函數在讀取字節后清除緩沖區內容的可能性極小,因為如果要查找以前的內容,則需要從文件中重新加載緩沖區,但同樣也不能保證這一點。

setbuf是傳統的 function,用途有限, setvbuf在緩沖模式和緩沖區大小方面優於 select,在極少數情況下它可能有用。

整理評論中發現的內容,不能保證 libc 實現會清除stdin緩沖區。 FILE結構可以在緩沖區中保留指向其當前 position 的指針。

此外,您需要將緩沖區的大小更改為BUFSIZ並使其生命周期為程序的 rest。 根據C11 標准

緩沖區的生命周期必須至少與打開的 stream 一樣長,因此 stream 應該在塊退出時釋放具有自動存儲持續時間的緩沖區之前關閉。

這可以通過使緩沖區成為全局緩沖區或將其聲明為static來實現:

static char buf[BUFSIZ];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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