跳轉至內容

C 程式設計/stdio.h/getchar

來自 Wikibooks,開放世界中的開放書籍

getchar 是 C 程式語言中一個函式,它從標準輸入流 stdin 讀取單個字元,無論該字元是什麼,並將它返回給程式。它在 ANSI-C 中指定,是 C 中最基本的輸入函式。它包含在 stdio.h 標頭檔案中。

getchar 函式原型如下[1]

int getchar(void);

示例用法

[編輯 | 編輯原始碼]

以下程式使用 getchar 將字元讀取到陣列中,並在找到檔案結束符後使用 putchar 函式打印出來。

 #include <stdio.h>

 int main(void)
 {
   char str[1000];
   int ch, n = 0;

   while ((ch = getchar()) != EOF && n < 1000) {
      str[n] = ch;
      ++n;
   }
   
   for (int i = 0; i < n; ++i)
      putchar(str[i]);
   
   putchar('\n'); /* trailing '\n' needed in Standard C */

   return 0;
 }

程式將讀取長度的最大值指定為 1000 個字元。它將在讀取 1000 個字元或讀取檔案結束指示符後停止讀取,以先發生者為準。

常見錯誤

[編輯 | 編輯原始碼]

使用 getchar 時一個常見的錯誤是在將其與 EOF 進行比較之前將其結果賦值給 char 型別的變數。[2]

以下示例展示了此錯誤

   char c;
   while ((c = getchar()) != EOF) { /* Bad! */
      putchar(c);
   }

考慮一個 char 為 8 位寬,表示 256 個不同值的系統。getchar 可以返回這 256 個可能的字元中的任何一個,也可以返回 EOF 來指示檔案結束,總共有 257 個不同的可能返回值。

getchar 的結果賦值給 char 時,char 只能表示 256 個不同的值,因此必然會丟失一些資訊 - 當將 257 個專案打包到 256 個槽中時,必然會發生衝突。EOF 值在轉換為 char 時,將與具有相同數值的 256 個字元中的一個無法區分。如果該字元在檔案中找到,則上述示例會將其誤認為是檔案結束指示符。

如果 char 型別是無符號的,則會發生相反的效果。因為 EOF 是負數,所以它永遠不可能等於任何無符號 char,因此上述示例不會在檔案結束時終止。它將永遠迴圈,重複列印將 EOF 轉換為 char 所產生的字元。

intchar 大小相同的系統上,即使上一節中的“良好”示例也會受到 EOF 和某個字元值無法區分的影響。處理這種情況的正確方法是在 getchar 返回 EOF 後檢查 feof 和 ferror。如果 feof 指示尚未到達檔案結束,並且 ferror 指示沒有發生錯誤,則可以假設 getchar 返回的 EOF 表示實際字元。這些額外的檢查很少進行,因為大多數程式設計師假設他們的程式碼永遠不需要在這些“大 char”系統上執行。


參考文獻

[編輯 | 編輯原始碼]
  1. http://www.phim.unibe.ch/comp_doc/c_manual/C/FUNCTIONS/getchar.html
  2. http://c-faq.com/stdio/getcharc.html
華夏公益教科書