getchar()和putchar()詳解

getchar()讀取標準輸入的下一個字符,直到遇到文件結束標誌或發生錯誤哦。

putchar(c)將c對應值輸出到標準輸出。成功的話返回c失敗返回EOF

getchar函數

從輸入流中讀取一個單個的字符,

如果輸入的是字符串,函數也只讀取頭一個字符,如果下面還有getchar函數則接着上個getchar函數讀到的下一個字符讀而不需要繼續輸入就會返回一個讀取的字符,

這裏涉及到緩衝,就是我們輸入的字符流其實是存在於緩衝區中,所以下一個getchar函數才能接着讀取;
getchar有一個int型的返回值.當程序調用getchar時.程序就等着用戶按鍵.用戶輸入的字符被存放在鍵盤緩衝區中.直到用戶按回車爲止(回車字符也放在緩衝區中).當用戶鍵入回車之後,getchar纔開始從stdio流中每次讀入一個字符.getchar函數的返回值是用戶輸入的第一個字符的ASCII碼,如出錯返回-1,且將用戶輸入的字符回顯到屏幕.
如用戶在按回車之前輸入了不止一個字符,其他字符會保留在鍵盤緩存區中,等待後續getchar調用讀取.也就是說,後續的getchar調用不會等待用戶按鍵,而直接讀取緩衝區中的字符,直到緩衝區中的字符讀完爲後,纔等待用戶按鍵.

注意:當用getchar進行輸入時,如果輸入的第一個字符爲有效字符(即輸入是文件結束符EOF,Windows下爲組合鍵Ctrl+Z, Unix/Linux下爲組合鍵Ctrl+D),那麼只有當最後一個輸入字符爲換行符’\n’(也可以是文件結束符EOF, getchar纔會停止執行,整個程序將會往下執行。譬如下面程序段:
while((c = getchar()) != EOF)
{
putchar(c);
}
執行程序,輸入:abc,然後回車。則程序就會去執行puchar(c),然後輸出abc,這個地方不要忘了,系統輸出的還有一個回車。然後可以繼續輸入,再次遇到換行符的時候,程序又會把那一行的輸入的字符輸出在終端上。
對於getchar,肯定很多初學的朋友會問,getchar不是以字符爲單位讀取的嗎?那麼,既然我輸入了第一個字符a,肯定滿足while循環(c = getchar()) != EOF的條件阿,那麼應該執行putchar(c)在終端輸出一個字符a。不錯,我在用getchar的時候也是一直這麼想的,但是程序就偏偏不着樣執行,而是必需讀到一個換行符或者文件結束符EOF才進行一次輸出。
對這個問題的一個解釋是,在大師編寫C的時候,當時並沒有所謂終端輸入的概念,所有的輸入實際上都是按照文件進行讀取的,文件中一般都是以行爲單位的。因此,只有遇到換行符,那麼程序會認爲輸入結束,然後採取執行程序的其他部分。同時,輸入是按照文件的方式存取的,那麼要結束一個文件的輸入就需用到EOF (Enf Of File). 這也就是爲什麼getchar結束輸入退出時要用EOF的原因。

putchar函數

說下用法和一些細節點;

putchar是輸出一個字符,

char ch=’d’;

putchar(ch)//輸出’d’

putchar(‘\n’);//輸出一個換行

putchar(‘a’);//輸出一個字符’a’

putchar(‘\101’);//輸出字符’A’

putchar(‘\015’);//輸出回車不換行,只是把光標移動到本行開頭,注意與換行的區別

//下面用一個題目來看其實如何獲取字符和輸出字符的
#include "stdio.h"
int main()
{
    char c,d,e,f;
    printf("please input two characters:\n");
    c=getchar();
    printf("第一getchar:");
    putchar(c);
    putchar('\n');
    d=getchar();
    printf("第二getchar:");
    putchar(d);
    putchar('\n');
    e=getchar();
    printf("第三getchar:");
    putchar(e);
    putchar('\n');
    f=getchar();
    printf("第四getchar:");
    putchar(f);
    putchar('\n');
    printf("---------\n");
    printf("c= %c\n",c);
    printf("d= %c\n",d);
    printf("e= %c\n",e);
    printf("f= %c\n",f);

    return 0;
}
//運行結果:
[root@localhost 1116]# ./getchar 
please input two characters:
12
第一getchar:1
第二getchar:2
第三getchar:

3
第四getchar:3
---------
c= 1
d= 2
e= 

f= 3
//分析:
getchar函數每次從緩衝區中得到一個字符,putchar函數每次輸出一個字符。

首先輸入了兩個字符12,然後回車,注意這時寫入緩存中的有3個字符12,回車。

程序中有四個getchar(),於是c='1',d='2',e='\n'。

這時運行到f=getchar();輸入緩存中的三個字符均被前三個getchar獲取,這時需要用戶輸入,

這裏輸入了3

於是f='3'3後面的回車沒有被利用。

這便是整個流程。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章