C語言中getchar()的返回類型爲什麼是int詳解

這篇文章主要給大家介紹了關於C語言中getchar()的返回類型爲什麼是int的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨着小編來一起學習學習吧

前言

在C語言中有個重要的庫函數getchar(),可從終端獲得一個字符的ASCII碼值。在終端輸入字符時並非輸入一個字符就會返回,而是在遇到回車換行前,所有輸入的在C語言中有個重要的庫函數getchar(),可從終端獲得一個字符的ASCII碼值。在終端輸入字符時並非輸入一個字符就會返回,而是在遇到回車換行前,所有輸入的字符都會緩衝在鍵盤緩衝器中,直到回車換行一次性將所有字符按序依次賦給相應的變量,在這裏一定要注意最後一個字符即'\n',該字符也會賦給一個相應的變量(當然這要你定義的用來接收字符的變量數比你輸入的可見字符多一纔可以)。

然而最近在重新閱讀K&R的《C程序設計語言》時對getchar()這個自帶的函數的返回值產生了疑惑。從字面上看,給函數返回的類型應該是char型,但在示例中,卻將返回內容賦值給了int型變量,示例代碼如下:

#include <stdio.h>
 
/* 將輸入複製到輸出 */ 
int main(void)
{
 int c;
 while ((c = getchar()) != EOF){
 putchar(c);
 }
 return 0;
}

書中給出的解釋爲:

因爲某些潛在的重要原因,我們在此使用int類型。

這裏作者並沒有對重要原因給出明確的說明,我試着將int修改爲char,發現程序還是能夠正常編譯與執行,這更加讓我疑惑!經過一翻搜索,找到的答案如下。

1、getchar()除了返回正常的字符外,還會返回輸入結束符EOF(end of file)。該函數原型如下:

int getchar(void)
{
 static char buf[BUFSIZ];
 static char *bb = buf;
 static int n = 0;
 if(n == 0)
 {
  n = read(0, buf, BUFSIZ);
  bb = buf;
 }
 return(--n >= 0)?(unsigned char) *bb++ : EOF;
}

2、EOF通常在<stdio.h>文件中被定義爲-1:

#define BUFSIZ 512
#define _NFILE _NSTREAM_
#define _NSTREAM_ 512
#define _IOB_ENTRIES 20
#define EOF (-1)

3、各種數據類型能表示的數值範圍由編譯器決定。char類型在有些編譯器中定義的範圍爲0~255,另外一些編譯器中定義的範圍爲-128~127。當編譯器中定義的範圍爲0~255時,用char接收getchar()返回值時就會出錯。數據類型具體的定義範圍可在<limits.h>文件中找到:

#define CHAR_BIT 8
#define SCHAR_MIN (-128)
#define SCHAR_MAX 127
#define UCHAR_MAX 0xff
 
#define CHAR_MIN SCHAR_MIN
#define CHAR_MAX SCHAR_MAX

4、將int改爲char後能在我的電腦上正常編譯,時由於我的編譯器中定義的範圍爲-128~127,當用char接收時會隱式的轉化爲char類型。

5、即使編譯器總定義的範圍爲-128~127,程序也有可能出錯。雖然常見字符到127位就結束了。但是ASCII表中分配到的時256。128~256爲拓展字符,如常用的歐元符號等均在內。

綜上:getchar()返回的內容用更大範圍區間的int型接收,才能使程序更加穩健。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對神馬文庫的支持。

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