getch()和getchar()有什么区别?

时间:2012-02-07 16:31:58

标签: c io console-application stdio c-standard-library

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

4 个答案:

答案 0 :(得分:28)

getchar()是一个标准函数,它从stdin中获取一个字符。

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

答案 1 :(得分:3)

标准C函数是getchar(),在<stdio.h>中声明。它从时间的曙光开始就已经存在。它会从标准输入(stdin)中读取一个字符,通常是用户的键盘,除非已将其重定向(例如,通过shell输入重定向字符<或管道)。

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

如果getchar是标准函数,自然就会出现问题,如何使用它来读取一个字符而无需等待Return键或不回显?这些问题的答案至少有点复杂。 (实际上,它们足够复杂,以至于我怀疑它们解释了getchgetche的持久流行,如果没有其他的话,它们很容易使用。)

答案是getchar无法控制诸如回声和输入缓冲之类的细节-就C而言,它们是与系统有关的底层问题。

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

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

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

因此,如果我们跟踪程序第一次调用getchar时发生的情况:stdio发现其输入缓冲区为空,因此它尝试从操作系统中读取某些字符,但是没有。尚无可用字符,因此read调用块。同时,用户可能正在键入一些字符,这些字符正在终端驱动程序的输入缓冲区中累积,但用户尚未按下Return键。最后,用户按下Return键,被阻塞的read调用返回,将整行字符返回给stdio,然后使用它们填充输入缓冲区,然后从缓冲区中返回第一个字符最初对getchar的呼叫,一直以来耐心等待。 (然后,如果程序第二次或第三次调用getchar,则可能 还有更多字符-用户键入的行中的下一个字符-可在stdio的输入缓冲区中使用getchar立即返回。有关此内容的更多信息,请参阅这些section 6.2中的C course notes。)

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

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

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

答案 2 :(得分:1)

getch()它只是输入一个输入但是从不在屏幕上显示输出,尽管我们按下回车键。

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

答案 3 :(得分:0)

  • getchar 是标准C,可在stdio.h中找到。它从stdin读取一个字符(在大多数系统上,标准输入流=控制台输入)。这是一个阻止呼叫,因为它要求用户键入一个字符,然后按Enter键。它将用户输入回显到屏幕上。

  • getc(stdin) getchar等效,但也可以用于其他输入流。

  • getch 是非标准的,通常在旧的过时的MS DOS标头conio.h中找到。它的作用与getchar相同,只是它在第一次按键后不会阻塞,它允许程序继续运行而无需用户按Enter。它不会在屏幕上回显输入。

  • getche getch相同,也是非标准的,但是它回显了输入到屏幕上的情况。