使用 C 語言中的 getchar 函式

Jinku Hu 2023年10月12日
  1. 在 C 語言中使用 getchar 函式從標準輸入流中讀取單個字元
  2. 在 C 語言中使用 getchar 函式讀取字串輸入
使用 C 語言中的 getchar 函式

本文將演示關於如何使用 C 語言中的 getchar 函式的多種方法。

在 C 語言中使用 getchar 函式從標準輸入流中讀取單個字元

getchar 函式是 C 庫中標準輸入/輸出實用程式的一部分。字元輸入/輸出操作有多個函式,如 fgetcgetcfputcputcharfgetcgetc 的功能基本相當;它們取檔案流指標讀取一個字元,並將其以 unsigned char 的形式轉換為 int 型別返回。

請注意,getchargetc 的特殊情況,它隱含地傳遞了 stdin 檔案流作為引數來讀取字元。因此,getchar 不需要任何引數,並將讀取的字元轉換為 int 型別返回。在下面的例子中,我們演示了用 putchar 函式輸入一個字元並列印的基本情況。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  int ch;

  printf("Please, input a single character: ");
  ch = getchar();
  putchar(ch);

  exit(EXIT_SUCCESS);
}

在 C 語言中使用 getchar 函式讀取字串輸入

或者,我們可以實現一個迴圈來讀取輸入的字串,直到遇到新的行或 EOF,並將其儲存在一個預先分配的 char 緩衝區。不過要注意,與呼叫 getsgetline 相比,這種方法會增加效能開銷,而 getsgetline 是實現同樣功能的庫函式。解決方案的主要部分是一個 while 迴圈,執行到 getchar 函式返回的值不等於新的行字元或 EOF

在這種情況下,我們任意分配一個大小為 20 個字元的 char 陣列。每一次迭代,都會實現陣列中第一個元素的指標,並將 getchar 的返回值分配給它。最後,我們用 printf 函式呼叫輸出緩衝區。

#include <stdio.h>
#include <stdlib.h>

enum { SIZE = 20 };

int main(void) {
  char buf[SIZE];
  char *p;
  int ch;

  p = buf;
  printf("Please, provide input: ");
  while ((ch = getchar()) != '\n' && ch != EOF) {
    *p++ = (char)ch;
  }
  *p++ = 0;
  if (ch == EOF) {
    printf("EOF encountered\n");
  }

  printf("%s\n", buf);

  exit(EXIT_SUCCESS);
}

輸出:

Please, provide input: string longer than 20 characters
string longer than 20 characters

儘管前面的例子程式碼通常都能正常工作,但它有幾個錯誤,可能導致緩衝區溢位錯誤或程式異常終止。由於我們處理使用者輸入的內容直到遇到新的行或 EOF,所以不能保證它能裝進固定大小的 char 緩衝區。如果我們必須使用固定緩衝區,我們要負責統計輸入的大小,並在達到容量後停止在緩衝區中儲存。

在前面的程式碼中我們解決了這個問題後,我們要處理使用%s 指定符列印緩衝區內容的 printf 語句。需要注意的是,並不能保證輸入字串的最後一個字元是空位元組,所以如果使用者自己沒有在緩衝區的最後插入空位元組,printf 呼叫就不知道停在哪裡。下面的示例程式碼糾正了之前的錯誤,並增加了一些行數,以便更好的演示。

#include <stdio.h>
#include <stdlib.h>

enum { SIZE = 20 };

int main(void) {
  char buf[SIZE];
  int ch;
  size_t index = 0;
  size_t chars_read = 0;

  printf("Please, provide input: ");
  while ((ch = getchar()) != '\n' && ch != EOF) {
    if (index < sizeof(buf) - 1) {
      buf[index++] = (char)ch;
    }
    chars_read++;
  }
  buf[index] = '\0';
  if (ch == EOF) {
    printf("EOF encountered\n");
  }
  if (chars_read > index) {
    printf("Truncation occured!\n");
  }

  printf("%s\n", buf);

  exit(EXIT_SUCCESS);
}

輸出:

Please, provide input: string longer than 20 characters
Truncation occured!
string longer than
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C Char