詳解getchar()函數與緩沖區

1、首先,我們看一下這段代碼:

?

它的簡單意思就是從鍵盤讀入一個字符,然后輸出到屏幕。理所當然,我們輸入1,輸出就是1,輸入2,輸出就是2。

那么我們如果輸出的是12呢?

?

它的輸出是1。

這里我們先簡單的解釋下,因為當我們從鍵盤輸入字符‘1’,‘2’,并按下回車后,我們的輸入被放入了輸入緩沖區,這個時候getchar()會從緩沖區中讀取我們剛才的輸入,一次只讀一個字符,所以字符1就被拿出來了,賦值給了c,然后putchar()又將c放在了標準輸出,也就是這里的屏幕,所以我們看見了最終的顯示結果1。同時字符‘1’也被緩沖區釋放了,而字符‘2’仍然被留在了緩沖區。而這樣是很不安全的,有可能下次使用的時候,我們的緩沖區會讀到一些垃圾,但是當程序結束的時候,它會自動刷新。

2、我們接著看下面的代碼:

?

大家覺得這幾行代碼是什么意思呢?大家是否真的看懂了呢?

如果你覺得你看懂了,那么我提一個問題,你覺得是不是你從鍵盤輸入一個字符就會輸出一個字符,直到遇見了換行符呢?

emmmmm。

如果你真的這么想了,那你就錯了。

它真正的運行過程應該是這樣的:還記得我們剛才說過的東西嗎,getchar()會從輸入緩沖區去讀取內容,也就是說我們把所有的內容都輸入完成并且按下了Enter鍵后,我們的輸入才被送進去了輸入緩沖區,這個時候,while循環才開始工作,每一次getchar()從輸入緩沖區讀取一個字符,然后如果不是換行符就輸出。

3、那么我們為什么要使用緩沖區呢?

舉個例子,我們知道計算機CPU的處理速度很快的,而我們鍵盤的輸入速度總是比不過CPU的處理速度,那么CPU就得一直等著鍵盤輸入完,這樣很浪費資源。于是,我們黨鍵盤輸入完了,再讓CPU一次性處理,這樣就會大大地提高效率。

又比如,我們的打印機打印文檔,打印機的處理速度是很慢的,所以我們會將文檔輸出到打印機的緩存中去,這樣打印機就可以自行慢慢打印,而不必占用CPU資源。

4、緩沖區的類型

  緩沖區 分為三種類型:全緩沖、行緩沖和不帶緩沖。

  1、全緩沖

  在這種情況下,當填滿標準I/O緩存后才進行實際I/O操作。全緩沖的典型代表是對磁盤文件的讀寫。

  2、行緩沖

  在這種情況下,當在輸入和輸出中遇到換行符時,執行真正的I/O操作。這時,我們輸入的字符先存放在緩沖區,等按下回車鍵換行時才進行實際的I/O操作。典型代表是鍵盤輸入數據。

  3、不帶緩沖

  也就是不進行緩沖,標準出錯情況stderr是典型代表,這使得出錯信息可以直接盡快地顯示出來。

5、緩沖區的刷新

緩沖區會在以下三種情況下被刷新:

1、緩沖區滿

2、執行flush刷新緩沖區的語句

3、程序正常結束。
---------------------
作者:lws123253
來源:CSDN
原文:https://blog.csdn.net/lws123253/article/details/79848373
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

轉載于:https://www.cnblogs.com/jack-hzm/p/10059231.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387824.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387824.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387824.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows下python安裝Numpy、Scipy、matplotlib模塊

python 2.7 針對2.7的軟件。numpy :http://sourceforge.net/projects/numpy/files/NumPy/1.8.1/ 下載下面的numpy-1.8.2-win32-superpack-python2.7 scipy: http://sourceforge.net/projects/scipy/files/matplotlib:matplotlib-1.1.0.win32-py2.7 以上都是exe文件&#xff0…

restTemplate使用和踩坑總結

日常工作中肯定會遇到服務之間的調用,尤其是現在都是微服務的架構,所以總結一下restTemplate的最常用的用法以及自己踩過的坑。 restTemplate的使用 restTemplate底層調用的是Execute方法,而Execute底層調用的是doExecute,它是基于…

常見編碼總結

本文總結自:https://blog.csdn.net/zmx729618/article/details/51821024 1. ISO 8859-1 字節數:1 范圍:0-255(編碼范圍是0x00-0xFF),其中0x00-0x7F之間完全和ASCII一致(ASCII是7位編碼&#xff…

啟動一個Java進程

windows版本 startup.bat -------------------------------------------------------- rem --------------------------------------------------------------------------- rem Start SMS Server by zhangjin rem --------------------------------------------------------…

Flask框架從入門到精通之參數配置(二)

知識點: 1、參數配置 一、概況 上一篇我們已經把Flask第一個程序運行起來了,那么這一篇主要講一下Flask參數的配置。 二、配置參數 Flask參數配置方式有很多種,每一種都可以達到結果,在合適的場景選擇合適的配置方式。 配置文件 在…

BP神經網絡python簡單實現

BP神經網絡的原理在網上有很詳細的說明,這里就不打算細說,這篇文章主要簡單的方式設計及實現BP神經網絡,并簡單測試下在恒等計算(編碼)作測試。 BP神經網絡模型圖如下 BP神經網絡基本思想 BP神經網絡學習過程由信息的…

golang的reflection(轉)(一)

2019獨角獸企業重金招聘Python工程師標準>>> 反射reflection 可以大大提高程序的靈活性,使得interface{}有更大的發揮余地反射可以使用TypeOf和ValueOf函數從接口中獲取目標對象信息反射會將匿名字段作為獨立字段(匿名字段的本質)…

idea教程--Maven 骨架介紹

簡單的說,Archetype是Maven工程的模板工具包。一個Archetype定義了要做的相同類型事情的初始樣式或模型。這個名稱給我們提供來了一個一致的生成Maven工程的方式。Archetype會幫助作者給用戶創建Maven工程模板,并給用戶提供生成相關工程模板版本的參數化…

datatables.js 簡單使用--多選框和服務器端分頁

說明:datatables是一款jQuery表格插件。感覺EasyUI的datagrid更易用 內容:多選框和服務器端分頁 緣由:寫這篇博客的原因是datatables的文檔寫的不怎么樣,找東西很麻煩 環境:asp.net mvc , vs2015sqlserver2012 顯示效…

python異常(高級) Exception

異常(高級) Exception 異常回顧:     try-except 語句 捕獲(接收)異常通知,把異常流程變為正常流程     try-finally 語句 執行必須要執行的語句.     raise 語句 發送異常通知,同時進入異常流程     assert 語句 發送AssertionError異常     with 語句 wi…

反射賦值

目前例子為NPOI Excel導入 入庫時調用 var file file1.PostedFile.InputStream;var fileExt System.IO.Path.GetExtension(file1.FileName);IWorkbook workbook;if (fileExt ".xlsx")workbook new XSSFWorkbook(file);elseworkbook new HSSFWorkbook(file);DB.D…

基于PCA(主成分分析)的人臉識別

代碼下載:基于PCA(主成分分析)的人臉識別 人臉識別是一個有監督學習過程,首先利用訓練集構造一個人臉模型,然后將測試集與訓練集進行匹配,找到與之對應的訓練集頭像。最容易的方式是直接利用歐式距離計算測…

從BMW Vision iNEXT 看寶馬如何進軍自動駕駛

安全很重要,空間也要很大,砍掉大量物理按鍵,內飾材料要環保,還要提供自動和主動兩套駕駛方案。這些描述僅是BMW Vision iNEXT(下稱Vision iNEXT)概念車的設計之冰山一角。 一款概念車當然無法完全代表未來…

CSS浮動(二)---Float

重新認識float 2.1. 誤解和“誤用” 既然提到“誤用”,各位看官就此想想,自己平日是怎么使用float的?另外,既然“誤用”加了引號,就說明這樣的使用并不是真正的誤用,而是誤打誤撞使用之后,帶…

Hadoop0.20.2版本在Ubuntu下安裝和配置

1、安裝JDK   (1)下載安裝JDK:確保計算機聯網之后命令行輸入下面命令安裝JDK   sudo apt-get install sun-java6-jdk   (2)配置計算機Java環境:打開/etc/profile,在文件最后輸入下面內容 …

云原生生態周報 Vol. 2

業界要聞 Kubernetes External Secrets 近日,世界上最大的域名托管公司 Godaddy公司,正式宣布并詳細解讀了其開源的K8s外部 Secrets 管理項目: Kubernetes External Secrets,簡稱KES。這個項目定義了ExternalSecrets API&#xff…

centos 7新機使用前操作

關閉防火墻 systemctl stop firewalld(停服務) systemctl status firewalld(看狀態) systemctl disable firewalld.service (永久關閉) selinux getenforce(查狀態) vi /etc/selinux…

ubuntu10.04+hadoop0.20.2平臺配置(完全分布式模式)

配置環境及有關工具:ubuntu10.04 、hadoop0.20.2 、 jdk1.6.0_29 我們的機器有三臺,一臺當作namenode、兩臺當作datanode: namenode:IP:192.168.0.25、機器名:kiddenzj (這里的機器名要注意:機…

成佛、遠不止渡滄海

地之及東南,有一海,稱為“滄海”。滄海對面,就是仙家佛地。凡是能渡過滄海到達彼岸的人,就能立地成佛,修成正果。 于是,許許多多的人千里迢迢趕來,或乘帆船,或乘木筏,紛紛…

軟件架構演進

傳統架構到分布式架構詳解 軟件架構演進軟件架構的發展經歷了從單體架構、垂直架構、SOA架構到微服務架構的過程,博客里寫到了這四種架構的特點以及優缺點分析,個人學習之用,僅供參考! 1.1.1 單體架構 特點:1、所有的…