C 语言 getc(), getchar(), getch() 和 getche() 的区别

2025年5月11日 | 阅读 6 分钟

在本文中,我们将讨论C语言中getc()、getchar()、getch()getche()之间的区别。作为C编程语言的基本组成部分,输入处理是一个非常重要的现象,并且有各种函数,如getc()、getchar()、getch()和getche()用于从源读取字符。所有这些函数都有特定的用例行为、物理用途和实现。以下是这些函数的一个详细比较。

1. 函数概述

getc()

  • 定义:getc()函数是在<stdio.h>中实现的常用类型库函数。它只能从给定的输入流中读取一个字符,所以必须先有一个输入流。
  • 语法:int getc(FILE *stream);

getchar()

  • 定义:getchar()是一个代理函数,用于从标准控制台或输入设备读取字符。
  • 语法:int getchar(void);

getch()

  • 定义:getch()函数是一个已存在的函数,但不是标准的,并且优先用于DOS和Windows环境。它以字符形式执行getch函数,直接从键盘获取字符而不将其显示在屏幕上。
  • 语法:int getch(void);

getche()

  • 定义:它与getch()类似,但getche()会在输入字符后立即将其显示在屏幕上。
  • 语法:int getche(void);

2. 详细比较

输入源

  • getc():它可以从任何指定的输入流读取,该流可以是文件或标准输入。这使得在文件I/O操作中能够适应各种输入需求。
  • getchar():它用于读取标准输入。这是一个更简单的接口,从中读取输入的是键盘。
  • getch():直接从键盘缓冲区检索其信息。它不依赖于按下Enter键,这使得它非常适合应用程序或网页捕获用户的首次输入。
  • getche():与readkey一样,它也从键盘缓冲区读取,但不是以“>”的形式,而是直接将字符打印到控制台窗口。当用户在输入过程中需要反馈时,它很有用。

回显行为

  • getc():它不会回显输入,字符在控制台上读取时不会显示。
  • getchar():与getc()一样,它也没有回显。它只显示字符,并等待用户按下Enter键,然后才继续返回字符。
  • getch():不回显;字符是静默读取的。这对于密码输入以及命令行提示符非常有用,因为不应该显示用户的输入。
  • getche():它会记录并立即将字符在控制台上播放出来,就像输入一样。这在用户输入时需要看到自己输入内容的应用程序中很有用。

缓冲

  • getc():读取文件时是全缓冲的,这意味着流会将一部分内容读入缓冲区,然后使用这些字符进行处理。这将提高文件I/O的性能。
  • getchar():从stdin读取时是行缓冲的,这意味着它在按下Enter键后才等待输入。由于输入不是自动获取的,因此可能需要一些时间才能完成。
  • getch():它调用read方法,该方法从键盘读取字符而不等待换行符。这使得交互式工作和即时响应用户输入成为可能。
  • getche():它也是非缓冲的,会在输入时回显字符。这意味着我们可以获得即时反馈。

返回值

  • getc():将读取的字符转换为整数,然后返回。如果读取过程中遇到文件末尾或发生错误,它将返回EOF,通常设置为-1。
  • getchar():与getc()函数一样,getchar()函数将下一个字符读取为int,并返回EOF表示没有输入或发生了错误。
  • getch():将读取的字符转换为整数。它不返回EOF,因为它的设计目的不是扫描文件流。
  • getche():函数与getch()类似,返回键入的字符而不返回EOF。但是,它不适用于流。

3. 用例

  • getc():它旨在允许从文件或流中读取字符,这在缓冲输入中是理想的。它有助于在文件处理应用程序中使用,例如逐字符读取配置文件、文本文件等。
  • getchar():它用于小型控制台应用程序,这些应用程序只想从标准输入中获取一个字符。它们非常适合用于选择菜单选项或非常简单的交互式选择。
  • getch():它经常用于需要立即获取用户输入的情况,例如在游戏或任何需要对键盘命令(除了Enter键)做出即时响应的程序中。
  • getche():它在需要即时响应的情况下很有用,例如在用户输入密码字符时显示它们,但之后可以将其隐藏。

4. 可移植性

  • getc() 和 getchar():它们都来自C标准库,可以在支持C的任何平台上工作。
  • getch() 和 getche():这些函数是某些特定编译器提供的,例如Turbo C和某些版本的GCC。它们可能在公司运营的所有环境中都不可用,这使得它们的便携性较差。

C语言中getc()、getchar()、getch()和getche()之间的主要区别

Difference between getc(), getchar(), getch() and getche() in C

C语言中的getc()、getchar()、getch()和getche()之间有几个主要区别。一些主要区别如下:

特点getc()getchar()getch()getche()
头文件<stdio.h><stdio.h><conio.h><conio.h>
目的一个从文件或流中读取单个字符的函数。它从输入流(即键盘)中读取单个字符。它允许对键盘进行阻塞式读取单个字符,这样就不会回显。从键盘输入单个字符并打印接收到的字符。
输入源任何自同义文件,即操作系统级别文件(如stdin或文件指针)。标准输入 (stdin)。直接键盘输入。直接键盘输入。
屏幕回显是的是的是的是的
缓冲受管理(第一行等待Enter键,第二行回显)。它将缓冲等待Enter键。不提供输入最后一行保护,而是非缓冲的。非缓冲(无需按Enter键)。
返回值int(字符的ASCII值)int(字符的ASCII值)int(字符的ASCII值)int(字符的ASCII值)
输入源任何文件或输入流(例如 stdin,文件指针)。标准输入 (stdin)。直接键盘输入。直接键盘输入。
屏幕回显是的是的是的是的
缓冲缓冲(等待Enter键)。缓冲(等待Enter键)。非缓冲(无需Enter键)。非缓冲(无需Enter键)。
范围文件I/O和标准输入。仅限于标准输入。仅限于键盘输入。仅限于键盘输入。
错误指示在发生错误或到达文件末尾时返回EOF。返回值:计算错误或输入结束时返回EOF。它不涉及错误信号,但它确实表明输出有问题。它不明确指示错误。
可移植性标准且可移植。标准且可移植。非标准(仅适用于Windows或DOS)。特定于Windows/DOS的非标准。
用例一种从文件或流中读取字符的方法。从标准输入读取输入字符。例如密码,读取时不会打印。读取能对用户行为提供即时响应的字符。

结论

总之,在C语言中使用getc()、getchar()、getch() 或 getche()的决定取决于特定的代码和环境。因此,getc() 可用于从文件或流中读取字符,并且通常在文件I/O中使用,它是标准C库的一部分并且可移植。getchar() 用于标准输入,对于拥有少量用户输入的C控制台应用程序很常见。相比之下,getch() 和 getche() 是非标准函数,特别用于Windows/DOS环境中进行不回显的键盘输入。确切地说,getch() 函数读取输入字符但不在屏幕上显示,非常适合受限输入,如密码。另一方面,getche() 函数会回显输入以进行即时显示,最适合交互式程序。因此,最便携且符合标准的实用函数是getc()和getchar(),而最适合开发人员希望程序能够即时输入的特定环境的实用函数是getch()和getche()。