当前位置: 首页 > 知识库问答 >
问题:

C 中的 getchar() 无需按回车键即可完成

穆鸿卓
2023-03-14

从我以前的帖子中,我了解到getchar()只有在我们按Enter键时才会完成。让我们考虑这个代码:

#include<stdio.h>
main()
{
  getchar();
  getchar();
  getchar();
  getchar();
  getchar();


}

我希望它是这样运行的:我按下某个键1,然后按Enter,然后按下键2,然后按Enter,然后按下键3,然后按下键4,最后按下键5,程序现在应该终止了。这不是实际发生的情况。事情是这样的:我按下某个键1,然后按Enter,然后按下键2,然后按下键3,然后按下Enter,程序最终终止!

  • 为什么最后两个getchar()不起作用

我观察到的另一个奇怪的事情是,如果我这样做:key 1、key 2、key 3、key 4回车,程序就会终止。例如。如果我连续按q、w、e和r,然后回车,程序就会终止。

  • 为什么不是所有的getchar()都要求输入?这是否意味着getchar()将任何其他键作为Enter?但是,下一个键是否作为下一个getchar()的输入

让我们考虑另一个代码:

#include<stdio.h>
main()
{

  int c=getchar();
  int d=getchar();
  int e=getchar();
  printf("2 getchar are remaining\n");
  int f=getchar();
  int g=getchar();
  printf(" c is %d, d is %d, e is %d, f is %d and g is %d",c,d,e,f,g);

} 

我输入:EFG EFG,然后输入。当我按C或D时,应该立即打印剩余的第2行getchar()。但它最后打印出来,这意味着所有getchar()都同时执行——这很奇怪。

  • 程序不是逐行执行的吗?一、 e.在第三个getchar之后,printf()应该可以工作。但当所有getchar()都被执行时,它终于可以工作了

共有3个答案

宋望
2023-03-14

程序不是逐行执行吗?即在第三个 getchar 之后,printf() 应该可以工作。但是当所有 getchar() 都被执行时,它终于起作用了。

它是逐行执行的,但是ENTER键是getchar()的有效输入,因此它将读取其ASCII值。不能告诉你更多,因为这个值因系统而异。

陆城
2023-03-14

对于第一个问题,回车键是getchar可以处理并返回的字符。因此,如果键入两个字符并按enter键,则必须调用getchar三次以清除输入缓冲区。记住,getchar不从键盘获取键,而是从输入缓冲区获取键。因此,如果您将五个字符推入输入缓冲区,例如abcd<kbd>enter</kbd>,则必须调用<code>getchar</code>五次才能获得所有这些字符,而第一个字符将不会返回,直到您按下<kbd<enter</kbd>。

这也解释了你的第二个问题。按下< kbd>enter键后,< code>getchar调用将按顺序执行,而不是同时执行,但第一个调用在此之前不会执行。

您可能想了解有关禁用输入缓冲的信息。

穆子琪
2023-03-14

getchar()在您按回车键后完成是不正确的。只要有要读取的字符,getchar()就会完成。这种区别很重要:例如,如果您使用将标准输入重定向到文件的程序:

$ hexdump -C abcd_file 
00000000  61 62 63 64 65                                    |abcde|
00000005

$ ./in < abcd_file 
$

请注意,“abcd_file”是一个包含“abcde”的文件,没有换行符,您的程序在任何地方都不需要换行符就完成了。这是因为该文件一直在提供字符,而不是等待换行符。

另一方面,普通终端或终端仿真器具有一种称为“规范模式”的操作模式。标准模式意味着终端支持“命令行处理设施”,并且在用户按下ENTER键之前不会发出可用字符的信号。这就是错误的“getchar()等待回车”故事的来源。您可以将终端从规范模式切换到检索所有字符,而无需按enter:

$ stty -icanon; ./in; stty icanon
ggggg$

在这种情况下,没有输入的5个字符使程序完成。

最后,getchar()看起来很早就返回的原因是它还返回了ENTER字符。因此,“a\nb\nc\n”是6个字符,前5个字符由getchar()返回,第6个字符在程序完成后从终端队列中删除。键入“abcd\n”还意味着getchar()将立即可用于连续5次读取,因为终端队列中存储了5个字符。

http://www.gnu.org/software/libc/manual/html_node/Noncanonical-Input.html#Noncanonical-Input

 类似资料:
  • 问题内容: 我有一个用Java编写的控制台程序,该程序可以响应单键按下,但是用户不按Enter。 我正在打乒乓球,所以需要上下键来移动蝙蝠的东西。 欢迎使用其他方法!(除了制作GUI外) -编辑: 我将只在UNIX系统(OSX和Linux)上运行程序,因此我可以通过以下方式将终端置于“原始”模式: 当我在运行程序之前在控制台中键入该命令时,它将起作用!但是我需要Java自动执行此操作,因此我尝试了

  • 我试图了解如何在tkinter/python中生成TAB键事件。 我在tkinter中有一个用于返回键的键绑定。 我不想调用函数(next_focus),只想生成一个TAB事件,这样,当按下TAB键时,正在使用的条目的现有验证将能够使用“focusout”运行。(我已经设置了带有验证的文本条目,以便在validate=focusout上执行检查并处理所有事情;但是我希望它能够处理这样一种情况,即用

  • 问题内容: 例如,使用winamp(至少在Windows上),您可以在后台以winamp播放全屏游戏,并使用媒体按钮*控制声音。Winamp不需要聚焦,可以使游戏继续全屏显示。 我更喜欢用Java编写此代码,但这可能行不通(在Java afaik中很难捕获没有重点的击键),因此任何C#解决方案也都可以。 因此,基本问题是:如何在没有重点的情况下捕获击键? *)我相信“后退/前进/停止/邮件/搜索/

  • 问题内容: 所以: 我曾经使用xmail(),当我在此处添加附件时,我传递了文件名和应该包含在其中的内容。 像这样: 如何使它以相同的方式工作,所以当我从PHPmailer类进行调用时,我可以传递相同的内容或类似的内容,因此不需要在服务器上发送实际文件? 问题答案: 例如 http://phpmailer.worxware.com/index.php?pg=tutorial#3

  • 问题内容: Python中是否有某种方法可以捕获事件而不将所有代码放入-语句中? 如果用户按下 +,我想干净地退出而没有任何痕迹 。 问题答案: 是的,您可以使用模块signal安装中断处理程序,并使用threading.Event永远等待:

  • 问题内容: 我正在设计一个iOS应用程序,我希望在iPhone中按回车键时,它可以将我定向到下一个下一个文本字段。 我发现了几个类似的问题,并且都给出了很好的答案,但是它们都恰好在Objective-C中,并且我正在寻找Swift代码,现在这是我到目前为止的想法: 它放置在连接的文件和包含文本字段的UIView的控制器中,但是我不确定那是否是正确的位置。 我基本上是Swift的新手,所以请解释每个