關於scanf和fgets連用
阿新 • • 發佈:2019-01-27
char * fgets ( char * str, int num, FILE * stream );
帶有快取區長度檢查的標準庫函式
直接在scanf下接fgets會出現問題
對於fgets(buf,sizeof(buf)/sizeof(buf[0]),stdin)的寫法,需要檢查之前的緩衝區
對於scanf,會將最後的回車返回給輸入。
解決辦法是清除scanf之後的輸入流(多餘的字元及回車符)
fflush可能不能做到所有環境通用#include <stdio.h> /* printf */ int main () { char temp[6]; char *temp1; scanf("%5s",temp); printf("%s\n",temp); //fflush(stdin); while(getchar() !='\n') continue; fgets(temp1,5,stdin); //fflush(stdin); printf("%s",temp1); return 0; }
while(getchar() !='\n')
continue;
是一個較好辦法
Scanf()函式讀取數字,字元,字串的時候,都會遺留一個換行符在緩衝區,但是它不讀取換行符(輸入數字時空白符都不讀),因為不讀所以遺留在了緩衝區。getchar()會讀取緩衝區剩餘的空白符,並且會遺留一個換行符。而gets()會讀取緩衝區空白字元,它讀了換行符,然後丟棄,所以它不會遺留換行符。可以認為使用它之後緩衝區是乾淨的。fgets和讀區取檔案有關,它也會讀取緩衝區內容。它讀區換行符後,保留它。它之後,緩衝區是乾淨的還是不乾淨的,哦,看引數和輸入。綜上,在scanf下面用其它三個函式時,要清空緩衝區,在getchar下面用除scanf的其它三個函式時(包括它自己拉。),要清空緩衝區,因為Scanf對它免疫。而gets之後用其它三個函式是安全的,而fgets之後是否清空視情況而定