[轉]C語言中的getchar和putchar詳解

原文出自https://blog.csdn.net/qq_36328643/article/details/53036527?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1

一、首先給出《The_C_Programming_Language》這本書中的例子:

#include <stdio.h>

int main( )
{
      int c;
      c = getchar();
  while (c != EOF)
    {
          putchar();
            c= getchar();
  }
    return 0;
}

這裏主要解釋下爲什麼要用int型來接受getchar函數。
很多時候,我們會寫這樣的兩行代碼:
char c;
c = getchar();
這樣就很有可能出現問題。因爲getchar函數除了返回終端輸入的字符外,在遇到Ctrl+D(Linux下)即文件結束符EOF時,getchar ()的返回EOF,這個EOF在函數庫裏一般定義爲-1。因此,在這種情況下,getchar函數返回一個負值,把一個負值賦給一個char型的變量是不正確的。

二、下面用一個題目來看其實如何獲取字符和輸出字符的。

#include "stdio.h"
main()
{
      char c,d,e,f;
      printf("please input two characters:\n");
  c=getchar();
    putchar(c);
    putchar('\n');
    d=getchar();
    putchar(d);
    putchar('\n');
    e=getchar();
    putchar(e);
    putchar('\n');
    f=getchar();
    putchar(f);
    putchar('\n');
    printf("c= %c\n",c);
    printf("d= %c\n",d);
    printf("e= %c\n",e);
    printf("f= %c\n",f);
}

運行後先輸入“12”,回車,再輸入“34”,回車。
運行環境是redhat gcc
運行結果:
please input two characters:
12
1
2

34
3
c=1
d=2
e=

f=3
下面具體解釋一下:
getchar函數每次從緩衝區中得到一個字符(包括換行符),putchar函數每次輸出一個字符(包括換行符)。
首先輸入了兩個字符12,然後回車,注意這時寫入緩存中的有3個字符1,2,回車。
程序中有四個getchar(),於是c=’1’,d=’2’,e=’\n’。
這時運行到f=getchar();輸入緩存中的三個字符均被前三個getchar獲取,這時需要用戶輸入,
這裏輸入了34
於是f=’3’,4和後面的回車沒有被利用。
這便是整個流程。

這裏我們要注意下面幾條:
1) 用getchar讀入時,如果不按回車符,所有輸入會放入緩衝區,而不會被讀入,所以執行c=getchar();時,我們輸入12,如果不按回車鍵,1仍然不會讀入;
2) 最後按下的回車鍵,雖是用來告訴系統輸入已結束,但同時也會作爲一個字符放入緩衝區,所以我們輸入12,按回車後,輸入流其實有三個字符:1、2、回車,而這個回車就被e讀取了;
3) 12是被當做兩個字符1和2(注意,不是數字1、2),而不像%d時,作爲一個數字12來看待;
4) putchar()輸出指定字符,不會在輸出後自動換行,所以putchar(c);和putchar(d);之間要加putchar(‘\n’);如果不加的話,會把c和d兩個自動(1、2)輸入到同一行。
5)getchar可以讀入所有字符。
6)windows下如果想結束,就輸入Ctrl+Z,表示EOF。

補充:上面這個用putchar會輸出字符,如果字符爲\n之類的也同樣輸出,即換行。

還有人認爲putchar、getchar和scanf、printf功能重複,甚至不如後兩個,實際上略有不同:

getchar跟putchar是輸入輸出單字符的,printf跟scanf可以輸入輸出多字符,並且getchar和putchar只可以用於字符型的輸入和輸出,而scanf和printf可以用於整型浮點型和字符型等類型的輸入和輸出,這也是因爲對於字符,用這兩個就比前面的簡單多了,你以後編得多了就知道了,希望能幫助到你

原文地址
http://www.cnblogs.com/hdchild/archive/2009/11/19/1606457.html

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