C語言超詳細講解getchar函數(shù)的使用_第1頁
C語言超詳細講解getchar函數(shù)的使用_第2頁
C語言超詳細講解getchar函數(shù)的使用_第3頁
C語言超詳細講解getchar函數(shù)的使用_第4頁
C語言超詳細講解getchar函數(shù)的使用_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第C語言超詳細講解getchar函數(shù)的使用目錄一、getchar函數(shù)二、緩沖區(qū)1、什么是緩沖區(qū)2、為什么要存在緩沖區(qū)3、緩沖區(qū)的類型4、緩沖區(qū)的刷新三、getchar函數(shù)的正確使用1、getchar的換行問題2、getchar與scanf的混合使用

一、getchar函數(shù)

從上面的介紹來看,我們要正確使用getchar函數(shù),首先得了解什么是緩沖區(qū)。

二、緩沖區(qū)

1、什么是緩沖區(qū)

緩沖區(qū)又稱為緩存,它是內(nèi)存空間的一部分。

也就是說,在內(nèi)存空間中預(yù)留了一定的存儲空間,這些存儲空間用來緩沖輸入或輸出的數(shù)據(jù),這部分預(yù)留的空間就叫做緩沖區(qū)。

緩沖區(qū)根據(jù)其對應(yīng)的是輸入設(shè)備輸出設(shè)備,分為輸入緩沖區(qū)和輸出緩沖區(qū)。

2、為什么要存在緩沖區(qū)

我們?yōu)槭裁匆刖彌_區(qū)呢?

比如我們從磁盤里取信息,我們先把讀出的數(shù)據(jù)放在緩沖區(qū),計算機再直接從緩沖區(qū)中取數(shù)據(jù),等緩沖區(qū)的數(shù)據(jù)取完后再去磁盤中讀取,這樣就可以減少磁盤的讀寫次數(shù),再加上計算機對緩沖區(qū)的操作大大快于對磁盤的操作,故應(yīng)用緩沖區(qū)可大大提高計算機的運行速度。

又比如,我們使用打印機打印文檔,由于打印機的打印速度相對較慢,我們先把文檔輸出到打印機相應(yīng)的緩沖區(qū),打印機再自行逐步打印,這時我們的CPU可以處理別的事情?,F(xiàn)在您基本明白了吧,緩沖區(qū)就是一塊內(nèi)存區(qū),它用在輸入輸出設(shè)備和CPU之間,用來緩存數(shù)據(jù)。它使得低速的輸入輸出設(shè)備和高速的CPU能夠協(xié)調(diào)工作,避免低速的輸入輸出設(shè)備占用CPU,解放出CPU,使其能夠高效率工作。

3、緩沖區(qū)的類型

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

1、全緩沖

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

2、行緩沖

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

3、不帶緩沖

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

4、緩沖區(qū)的刷新

以下四種情況會引發(fā)緩沖區(qū)刷新:

緩沖區(qū)滿時;執(zhí)行flush語句;執(zhí)行endl語句;關(guān)閉文件。

三、getchar函數(shù)的正確使用

1、getchar的換行問題

我們來觀察下面這段代碼

#includestdio.h

intmain()

intch=0;

while((ch=(getchar()))!=EOF)

putchar(ch);

return0;

}

我們可以看到我們每次從鍵盤輸入一個字符并回車后,putchar輸出時會自動換行,就是因為我們每次除了輸入字符外,還敲了一個回車,而這個回車會被存儲在緩沖區(qū)中,當我們用getchar讀取字符時,會從緩沖區(qū)中依次逐個讀取所有的字符(包括換行、空格、Tab),直到緩沖區(qū)中沒有數(shù)據(jù),每讀取一個字符就用putchar打印一下,所以這里會自動換行。

^Z:Ctrl+Z,輸入后會被認定為EOF,從而來結(jié)束循環(huán)(VS中有些時候要重復(fù)按三次才會結(jié)束循環(huán),其他編譯器都是按一次)。

2、getchar與scanf的混合使用

我們來觀察下面這段代碼:

#includestdio.h

intmain()

charpassword[20]={0};

printf("請輸入密碼:

scanf("%s",password);

printf("請確認密碼(Y/N):

intch=getchar();

if(ch=='Y')

printf("確認成功\n");

else

printf("確認失敗\n");

return0;

我們可以看到程序并沒有等待我們輸入Y/N來確認密碼,而是直接結(jié)束,原因就是我們緩沖區(qū)中存放的是abcdef\n,而scanf函數(shù)是遇到空格、換行符(\n)、Tab時結(jié)束,所以\n并沒有被讀取走,而是繼續(xù)留在了緩沖區(qū)中,而當getchar讀取數(shù)據(jù)時發(fā)現(xiàn)緩沖區(qū)中并不為空,所以直接讀取了\n,然后判斷if條件,結(jié)束程序,而不會等待我們輸入Y/N。

那么要如何避免這種情況發(fā)生呢?有兩種方法:

法一:在scanf后面加一個getchar(不推薦)

#includestdio.h

intmain()

charpassword[20]={0};

printf("請輸入密碼:

scanf("%s",password);

getchar();//讀取剩下的\n

printf("請確認密碼(Y/N):

intch=getchar();

if(ch=='Y')

printf("確認成功\n");

else

printf("確認失敗\n");

return0;

我們在scanf函數(shù)后面加上一個getchar函數(shù),用于清空緩沖區(qū)里面多余的\n,但是這種方法有弊端,不推薦使用,具體弊端如下:

如圖:我們從鍵盤輸入abcdef,我們可以看到,程序并沒有等待我們輸入Y/N,而是直接執(zhí)行if語句,這是因為scanf函數(shù)遇到空格、換行符(\n)、Tab時會停止讀取,所以緩沖區(qū)中剩下的字符是_ef\n,一次getchar無法清空緩沖區(qū)。所以說,法一只能解決一部分情況,想要徹底解決scanf緩沖區(qū)殘留的問題需要用到法二。

法二:在scanf后面加while(getchar()!=\n)語句(推薦)

#includestdio.h

intmain()

charpassword[20]={0};

printf("請輸入密碼:

scanf("%s",password);

getchar();//讀取剩下的\n

printf("請確認密碼(Y/N):

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

intch=getchar();

if(ch=='Y')

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論