使用 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