getch() 和 getchar() 有啥区别?

Posted

技术标签:

【中文标题】getch() 和 getchar() 有啥区别?【英文标题】:What is the difference between getch() and getchar()?getch() 和 getchar() 有什么区别? 【发布时间】:2012-02-29 02:26:53 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

先生,能否请您指出资源或用示例解释“可能与标准输入不同”的陈述?谢谢! 意思是stdin可能是键盘,也可能是另一个输入流。【参考方案2】:

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

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

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

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

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

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

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

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

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

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

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

【讨论】:

关于如何调整终端驱动程序行为的任何指针? @Thisisn'tmyrealname 所有血腥细节:不。指针:好建议;已添加。【参考方案3】:

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

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

【讨论】:

getchar() 返回字符但不显示。这取决于程序员。如果输入没有煮熟,getchar() 可以在按下输入之前从标准输入读取。【参考方案4】:

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

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

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

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

【讨论】:

我相信getch 会阻塞直到按下一个键,它只是不会阻塞等待行尾的 Return。 @SteveSummit 啊,是的,我把它和另一个叫做kbhit 的老歌搞混了。固定。

以上是关于getch() 和 getchar() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

gets() 和 getchar() 还有 getch() 的区别

getch 和 getchar 在 windows 和 unix下的区别

getch与getchar区别

getch和getchar的区别

区分getchar(),getch(),getche()三个函数:

getchar getche getch