21

getchgetchar函数之间的确切区别是什么?

4

4 回答 4

31

getchar()是从标准输入获取字符的标准函数。

getch()是非标准的。它从键盘获取一个字符(可能与标准输入不同)并且不回显它。

于 2012-02-07T16:33:54.410 回答
7

标准 C 函数是 is getchar(),在<stdio.h>. 它基本上自古以来就存在。它从标准输入 ( ) 中读取一个字符,stdin该字符通常是用户的键盘,除非它已被重定向(例如通过 shell 输入重定向字符<或管道)。

getch()并且getche()是旧的 MS-DOS 函数,在 中声明<conio.h>,并且在 Windows 系统上仍然很流行。它们不是标准 C 函数;它们并不存在于所有系统上。getch立即从键盘读取一个击键,无需等待用户按下 Return 键,也无需回显击键。getche是一样的,只是它确实回显。据我所知,getch总是getche 键盘上阅读;它们不受输入重定向的影响。

问题自然就来了,如果getchar是标准函数,你如何使用它来读取一个字符而不等待回车键,或者不回显?这些问题的答案至少有点复杂。(事实上​​,它们足够复杂,我怀疑它们解释了 and 的持久流行getchgetche如果没有别的,它非常容易使用。)

答案是它getchar无法控制回显和输入缓冲等细节——就 C 而言,这些都是低级的、系统相关的问题。

getchar但是了解假设的基本输入模型很有用。令人困惑的是,通常有两种不同级别的缓冲。

  1. 当用户在键盘上键入键时,操作系统的终端驱动程序会读取它们。通常,在其默认模式下,终端驱动程序在键入时立即回显击键(因此用户可以看到他们正在键入的内容)。通常,在其默认模式下,终端驱动程序还支持一定数量的行编辑——例如,用户可以按 Delete 或 Backspace 键来删除意外键入的字符。为了支持行编辑,终端驱动程序通常在输入缓冲区中收集字符. 只有当用户点击 Return 时,该缓冲区的内容才可供调用程序使用。(仅当标准输入实际上是键盘或其他串行设备时才存在此级别的缓冲。如果标准输入已重定向到文件或管道,则终端驱动程序无效并且此级别的缓冲不适用。)

  2. stdio 包将字符从操作系统读取到它自己的输入缓冲区中。 getchar只需从该缓冲区中获取下一个字符。当缓冲区为空时,stdio 包会尝试通过从操作系统读取更多字符来重新填充它。

因此,如果我们跟踪程序第一次调用时发生的情况getchar:stdio 发现它的输入缓冲区是空的,所以它尝试从操作系统读取一些字符,但还没有任何可用的字符,所以read调用块。同时,用户可能正在键入一些字符,这些字符正在终端驱动程序的输入缓冲区中累积,但用户还没有点击 Return。最后,用户点击 Return,被阻塞的read调用返回,将整行的字符返回到stdio,它使用它们填充输入缓冲区,然后将第一个字符返回到初始getchar调用一直在等待。(然后如果程序getchar第二次或第三次调用,可能更多字符——用户键入的行中的下一个字符——在 stdio 的输入缓冲区中可用,getchar以便立即返回。有关这方面的更多信息,请参阅这些C 课程笔记的第 6.2 节。)

但在所有这些中,正如您所看到getchar的,stdio 包无法控制回显或输入行编辑等细节,因为这些是在终端驱动程序中的较早、较低级别的步骤 1 中处理的。

因此,至少在类 Unix 操作系统下,如果您想在不等待 Return 键的情况下读取字符,或者控制是否回显字符,您可以通过调整终端驱动程序的行为来实现。细节各不相同,但有一种方法可以打开和关闭回声,还有一种方法(实际上有几种方法)可以打开和关闭输入行编辑。(对于这些细节中的至少一些,请参阅这个 SO question或旧C FAQ list中的问题 19.1。)

当输入行编辑关闭时,操作系统可以立即返回字符(无需等待 Return 键),因为在这种情况下它不必担心用户可能键入了需要“采取”的错误击键back" 使用 Delete 或 Backspace 键。(但同理,当程序在终端驱动程序中关闭输入行编辑时,如果要让用户纠正错误,就必须实现自己的编辑,因为它会看到---即连续调用getchar将返回——用户的错误字符Delete 或 Backspace 键的字符代码。)

于 2018-07-04T12:03:55.943 回答
1

getch()尽管我们按下了回车键,但它只是获取输入,但从不将其显示为屏幕上的输出。

getchar()当我们按下回车键时,它会获得一个输入并将其显示在屏幕上。

于 2013-10-06T15:45:49.963 回答
1
  • getchar是标准 C,可在 stdio.h 中找到。stdin它从(标准输入流 = 大多数系统上的控制台输入)读取一个字符。这是一个阻塞调用,因为它要求用户输入一个字符然后按回车。它将用户输入回显到屏幕上。

  • getc(stdin)100% 等同于getchar,除了它也可以用于其他输入流。

  • getch是非标准的,通常在旧的过时的 MS DOS 头文件 conio.h 中找到。它的工作原理就像getchar在第一次击键后不会阻塞,它允许程序在用户不按 enter 的情况下继续。它不会将输入回显到屏幕。

  • getche与 相同getch,也是非标准的,但它会将输入回显到屏幕。

于 2018-07-04T11:39:29.767 回答