天天看點

關于scanf和fgets連用

char * fgets ( char * str, int num, FILE * stream );      

帶有緩存區長度檢查的标準庫函數

直接在scanf下接fgets會出現問題

對于fgets(buf,sizeof(buf)/sizeof(buf[0]),stdin)的寫法,需要檢查之前的緩沖區

對于scanf,會将最後的回車傳回給輸入。

解決辦法是清除scanf之後的輸入流(多餘的字元及回車符)

#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;
}
           

fflush可能不能做到所有環境通用

while(getchar() !='\n')

continue;

是一個較好辦法

Scanf()函數讀取數字,字元,字元串的時候,都會遺留一個換行符在緩沖區,但是它不讀取換行符(輸入數字時空白符都不讀),因為不讀是以遺留在了緩沖區。getchar()會讀取緩沖區剩餘的空白符,并且會遺留一個換行符。而gets()會讀取緩沖區空白字元,它讀了換行符,然後丢棄,是以它不會遺留換行符。可以認為使用它之後緩沖區是幹淨的。fgets和讀區取檔案有關,它也會讀取緩沖區内容。它讀區換行符後,保留它。它之後,緩沖區是幹淨的還是不幹淨的,哦,看參數和輸入。綜上,在scanf下面用其它三個函數時,要清空緩沖區,在getchar下面用除scanf的其它三個函數時(包括它自己拉。),要清空緩沖區,因為Scanf對它免疫。而gets之後用其它三個函數是安全的,而fgets之後是否清空視情況而定

繼續閱讀