1. 程式人生 > >c語言緩衝輸入和非緩衝輸入的分析(stdin和stdout流的應用,getchar,getch的區別)

c語言緩衝輸入和非緩衝輸入的分析(stdin和stdout流的應用,getchar,getch的區別)

一、緩衝輸入和非緩衝輸入的例項

1.1、緩衝輸入例項

1.2、非緩衝輸入例項

效果:按下一個字元,控制檯螢幕就顯示該字元。當按下‘#’字元時候,則提示press any key to continue.

二、緩衝輸入和非緩衝輸入分析

1、程式分析

      getchar()函式的原型為  int getchar(void);   函式功能:從stdin流中讀一個字元/一個位元組。

      putchar()函式的原型為 int putchar(int ch); 函式功能:   從stdout流上輸出一個字元/一個位元組。

     當我們輸入 HI! #hello,world,按下Enter(回車鍵)時候,螢幕上會一次性顯示一個字串“HI !”。這時候可能就會產生一個疑問。"getchar()每次只讀取一個字元,為什麼這裡會顯示一個字串?同時,為什麼我輸入一個字元後,沒有立刻在螢幕上回顯該字元?

"

    原因:使用getchar()函式獲取按鍵字元,表示您選用了緩衝輸入型別。您所鍵入的字元被收集並存儲在一個被稱為緩衝區(buffer)的臨時儲存區域中。按下回車鍵後,您所建入的字元會對映到stdin(輸入流),從而被C程式處理,此時表現為字元快對程式可用。即執行while迴圈,不停呼叫putchar(ch),知道遇到'#'為止。

2、緩衝輸入與非緩衝輸入模型

流程圖分析

2.1、概念

緩衝輸入:檔案緩衝輸入通常表現為延遲迴顯。即您所鍵入的字元被收集並存儲在一個被稱為緩衝區的(buffer)的臨時儲存區域中。按下回車鍵則可使您所鍵入的字元快對程式可用。

非緩衝輸入:輸入字元立即回顯。即該內容對程式立即可用。

2.2、需求

需要緩衝輸入的原因:

(1)講若干個字元作為一個快傳輸比逐個傳送這些字元耗費的時間少。

(2)如果您輸入有誤,就可以使用您的鍵盤更正功能來修正錯誤。當最終按下回車鍵的時候,您就可以傳送正確的輸入。

需要非緩衝輸入的原因:

一些互動性的程式需要非緩衝輸入。例如,在遊戲中,你需要一按下鍵就執行某種命令。此時,通常會用到getch()函式來獲取按鍵的ascii,從而實現按鍵響應響應的操作。

三、C程式處理輸入輸出的流程圖分析

流程圖分析

     從概念上來說,C程式處理一個流而不是直接處理檔案。流(stream)是一個理想化的資料流,實際輸入或者輸出對映到這個資料流。這意味著具有不同屬性的多種型別的輸入由流表示,會具有更多統一的屬性。於是開啟檔案的過程就成為將流與檔案相關聯,並通過流進行讀寫的過程。

相關推薦

c語言緩衝輸入緩衝輸入分析stdinstdout應用getchar,getch區別

一、緩衝輸入和非緩衝輸入的例項 1.1、緩衝輸入例項 1.2、非緩衝輸入例項 效果:按下一個字元,控制檯螢幕就顯示該字元。當按下‘#’字元時候,則提示press any key to continue. 二、緩衝輸入和非緩衝輸入分析 1、程式分析       getch

c語言實現rsa nopadding對稱加密演算法openssl api方式匹配java後端 bouncycastle

公私鑰: —–BEGIN PUBLIC KEY—– MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC32V2IAfotG8bZhPF8/Bx8y65g EDycAMyTWmvpPCfagEKORO/WvdkTYim7yhG/+

C語言程序】讓用戶輸入一句話輸出這句話中每個單詞含有多少個字母

get mage 一句話 printf png es2017 urn bsp can #include <stdio.h>#define N 100 //宏定義,用N表示100 int main(int argc, char *argv[]) { int i

jQuery判斷輸入法輸入法輸入

one 輸入法 中文輸入 console mst tar 方案 turn jquer 需求背景:   頁面需要輸入完成後自動查詢。 解決方案: $(‘input‘).on(‘input‘, function() { if ($(this).prop(‘comSta

Go 緩衝 channel 緩衝 channel 的區別

在看本篇文章前我們需要了解阻塞的概念 在執行過程中暫停,以等待某個條件的觸發 ,我們就稱之為阻塞 在Go中我們make一個channel有兩種方式,分別是有緩衝的和沒緩衝的 緩衝channel

Go 緩衝 channel 緩衝 channel 的區別

在看本篇文章前我們需要了解阻塞的概念 在執行過程中暫停,以等待某個條件的觸發 ,我們就稱之為阻塞 在Go中我們make一個channel有兩種方式,分別是有緩衝的和沒緩衝的 緩衝channel 即 buffer channel 建立方式為 make

C語言:用單鏈表實現輸入排序

純當練習 連結串列頭結點儲存的資訊是連結串列長度 平臺VS2015 #include<stdio.h> #include<stdlib.h> #include<time.h> struct ListNod

go中緩衝通道緩衝通道區別

1:緩衝通道滿時,試圖往裡面傳送資料,會導致執行緒阻塞 2:緩衝通道為空時,試圖往裡面取資料,會導致執行緒阻塞 3:關閉非緩衝通道時,取資料,會導致程式崩潰 4: 試圖往非緩衝通道傳送資料時,若另一方不接受資料,會導致執行緒阻塞 5:緩衝通道是非同步的,非緩衝通道是非

二分查詢遞迴遞迴實現c語言實現

#include<stdio.h>++ int seeqSearch(int a[],int n,int k){     int i=n-1;     for(;i>=0;i--){//遍歷陣列         if(a[i]==k){//找到對應的陣列

大一C語言初學者期末考試複習:輸入判斷是否閏年

題目: 輸入年,判斷是否閏年 閏年判斷條件:1、能被4整除且不能被100整除  2、能被400整除  (二者滿足其一即可) #include <stdio.h> int main() {int n;printf("please input the year\n"

C語言:迴圈名句運用 累加器輸入一個數值進行累加輸入13

/*累加器輸入一個數值進行累加,輸入13*/ #include<stdio.h> void main() {int i,a,s=0;printf("請輸入一個整型數值進行累加:");scanf("%d",&a);for(i=1;i<=a;i++){

C語言中如何解決:連續輸入一串資料到陣列中,用空格隔開並用回車結束

C語言中getchar()函式的運用及注意事項 getchar()函式的運用 getcahr()函式是專門用於輸入字元常量的函式,它沒有引數,函式從鍵盤緩衝區裡面取出一個字元。 int *a; in

C語言:編寫一個程式統計輸入字串中各個數字、空白字元、以及其他所有字元出現的次數。

#include<stdio.h> int main() {      int c = 0;      int num_count = 0;      int emp_count = 0;      int els_count = 0;            w

c語言】依次將10個數輸入要求輸出其中最大的數

// 依次將10個數輸入,要求輸出其中最大的數 #include <stdio.h> int main() { int a[10]; int i; int temp; printf("請輸入10個數:"); for( i = 0; i < 1

C語言簡單說】九:輸入

到了下午了,上著班發現沒啥事情做… 又來碼部落格了 ↖(▔^▔)↗ 這一小節我們來說說輸入吧。突然想總結以下if語句的,結果發現,還有一個輸入沒說;之前是不是說過了輸出?就是printf這個,現在還

C語言獲取執行文件(XXX.exe)文件名目錄路徑

color lan .net director blank Go 執行 pause sys 同CSDN上的 https://blog.csdn.net/Higashino_Keigo/article/details/80489874 C語言獲取執行文件(XXX.exe)文件

朱有鵬C語言高階---4.9.10--雙鏈表--頭插入尾插入10

朱有鵬C語言高階---4.9.10--雙鏈表--頭插入和尾插入(10)   尾插入:   頭插入:   注意下面的程式碼中,insert_head()函式裡面語句的順序,第一語句和第二語句的順序可以互相調換,但是第一語句和第二語句要在

C語言分別求兩個整數的最大公約數最小公倍數

#include <stdlib.h> #include <math.h> #include <stdio.h> //遞迴演算法 //歐幾里得演算法 void GCD(int a, int b) {     int temp;

C語言N叉樹遞迴前中後遍歷法

#include <stdio.h> #include <stdlib.h> typedef struct kk { char ch; int flag; struct kk *left; struct kk *right; }btr

C語言資料結構——一步步教會你尾插法頭插法

連結串列也是線性表的一種,與順序表不同的是,它在記憶體中不是連續存放的。在C語言中,連結串列是通過指標相關實現的。而單鏈表是連結串列的其中一種,關於單鏈表就是其節點中有資料域和只有一個指向下個節點的指標域。  建立單鏈表的方法有兩種,分別是頭插法和尾插法。 所謂頭插法,就是按節點的