日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言清空缓冲区

發布時間:2025/1/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言清空缓冲区 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看下面一個例子:

[cpp]?view plaincopy
  • #include?<stdio.h>??
  • int?main()??
  • {??
  • ????int?num;??
  • ????char?ch?;??
  • ????scanf("%d",?&num);??
  • ????scanf("%c",?&ch);??
  • ????printf("hello?world\n");??
  • ????system("pause");??
  • ????return?0;??
  • }??


  • 設想輸入一個數字和一個字母,應該出現如下情況

    1

    a

    hello world

    但事實是下面的樣子

    1

    hello world

    -----------------------------

    原因是:在輸入回車(‘\n’)時,相當于輸入了一個字符,這樣緩沖區內就殘留了一個‘\n’。


    再有就是我們使用scanf("%c",?&ch);在中斷接受一個字符,但若用戶輸入好幾個字符,那么ch將只接受一個,而這時大量字符滯留在緩沖區內,下次再調用scanf時,還沒有輸入東西,緩沖區內的內容直接傳到了scanf內,這樣就造成了嚴重的錯誤。

    下面是幾種解決辦法:

    ①解決辦法一

    [cpp]?view plaincopy
  • #include?<stdio.h>??
  • int?main()??
  • {??
  • ????int?num;??
  • ????char?ch?;??
  • ????scanf("%d",?&num);??
  • ????setbuf(stdin,?NULL);//使stdin輸入流由默認緩沖區轉為無緩沖區??
  • ????scanf("%c",?&ch);??
  • ????printf("hello?world\n");??
  • ????system("pause");??
  • ????return?0;??
  • }??


  • 使用setbuf(stdin,null);可以使stdin輸入流由默認緩沖區轉為無緩沖區,這樣scanf輸入完畢后,緩沖區內的東西就消失了。

    [cpp]?view plaincopy
  • #include?<stdio.h>??
  • int?main()??
  • {??
  • ????int?num;??
  • ????char?ch?;??
  • ????scanf("%d",?&num);??
  • ????while?((c?=?getchar())?!=?EOF?&&?c?!=?'\n');//不停地使用getchar()獲取緩沖中字符,直到獲取的c是“\n”或文件結尾符EOF為止??
  • ????scanf("%c",?&ch);??
  • ????printf("hello?world\n");??
  • ????system("pause");??
  • ????return?0;??
  • }??


  • 使用getchar不斷獲取緩沖區內的內容,直到緩沖區內空為止,這種方法很有效,建議使用,C primer 上也介紹了這種方法。


    注意:有很多人可能覺得使用fflush(stdin);不就能清空緩沖區了,但使用這種方法有很多不確定性。

    網上查了原因:C和C++的標準里從來沒有定義過 fflush(stdin)。
    某些編譯器(如VC6)支持用 fflush(stdin) 來清空輸入緩沖,
    但是并非所有編譯器都要支持這個功能(Linux?下的 gcc 就不支持),//親測確實如此在linux的gcc下不能清空緩沖區
    因為標準中根本沒有定義 fflush(stdin)。

    MSDN 文檔里 也清楚地寫著
    fflush on input stream is an extension to the C standard(fflush 操作輸入流是對 C 標準的擴充)。

    總結

    以上是生活随笔為你收集整理的C语言清空缓冲区的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。