關於scanf和fflush

在C語言的書籍中經常看到scanf()的一下寫法:spa

  
  
  
  
  
scanf("%d",&hoge);

scanf不是以行單位對輸入內容進行解釋,而是對連續的字符流進行解釋(包含換行)。scanf()連續地從流中讀入字符,而且對和格式說明(%d)想匹配的的部分進行變換處理。指針

例如,格式說明符爲%d時,輸入code

123↵get

此時,從流中取得123,可是↵依然殘留在輸入流中,可能會被後面的過程吞掉,形成不想要的結果。input

例如:
it

  
  
  
  
  
#include <stdio.h>int main(void){int hoge;char buf[256];printf("&hoge...%p\n",&hoge);printf("Input intitial value.\n");// fgets(buf,sizeof(buf),stdin);// sscanf(buf,"%d",&hoge);scanf("%d",&hoge); //若是使用scanf則後面的getchar()會吞掉結束的回車符fflush(stdin);for(;;){printf("hoge..%d",hoge);getchar();hoge++;}return 0;}

這裏第一個getchar()將會吞掉↵。io

此外scanf()在讀入的過程當中,成功轉換爲幾個字符就返回幾。function

例如class

  
  
  
  
  
while (scanf("%d", &hoge) != 1) {printf("輸入錯誤,請再次輸入!");}

上面的例子也不能用fflush(stdin)來處理雖然能獲得同樣的結果,可是在其餘的平臺上卻會獲得不肯定的結果。由於fflush()是對輸出流使用的而不是對輸入流使用的。C++標準中是這樣描述的:stream


int fflush(FILE *stream);

If stream points to an output stream or an update stream in which
the most recent operation was not input, the fflush function causes
any unwritten data for that stream to be delivered to the host environment
to be written to the file; otherwise, the behavior is undefined.


參考文獻:

《征服C指針》

C++ referrence:http://www.cplusplus.com/reference/cstdio/fflush/

 

相關文章
相關標籤/搜索