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

2024-01-08

From my 上一篇文章 https://stackoverflow.com/q/27297811/3429430,我知道 getchar() 仅当我们按 Enter 时才完成。让我们考虑一下这段代码:

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


}

我期望它像这样运行:我按某个 key1 然后按 Enter,然后按 key2 和 Enter,然后 key3 和 Enter,然后 key4 和 Enter,最后按 key5+Enter,程序现在应该终止。这并不是实际发生的情况。发生的情况是这样的:我按某个 key1,然后按 Enter,然后按 key2 和 Enter,然后按 key3 和 Enter,程序最终终止!

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

我观察到的另一个奇怪的事情是,如果我这样做:key1,key2,key3,key4+Enter,那么程序就会终止。例如。如果我连续按 q、w、e 和 r,然后按 Enter,程序就会终止。

  • 为什么不是所有的 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);

} 

我输入:ABCDEFG 然后回车。线路还剩 2 个 getchar应该在我按 C 或 D 时立即打印。但它最后打印,意味着所有 getchar() 同时执行 - 这很奇怪。

  • 程序不是逐行执行的吗? IE。在第三次 getchar 之后, printf() 应该可以工作。但当所有 getchar() 都执行完毕后,它终于起作用了。

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

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

$ ./in < abcd_file 
$

请注意,“abcd_file”是一个包含“abcde”的文件,没有换行符,并且您的程序完成时不需要在任何地方添加换行符。这是因为文件始终提供字符而不等待换行符。

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

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

在本例中,没有输入的 5 个字符使程序完成。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C中的getchar()无需按Enter键即可完成 的相关文章

  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a

随机推荐

  • 读取java中的javascript对象

    我有一个如下所示的 JavaScript 对象 name type text onClick function console log Hello 它像Java中一样以字符串格式存储 String obj name type text on
  • 如何将 pdf 文件附加到重力表格通知中?

    重力表单提供了一种从文件上传器附加文件的方法 请参阅下面的代码 但是我如何更改此代码以简单地从隐藏字段值附加我自己的 PDF 文件或简单地将 pdf 文件粘贴到此代码中 我尝试了一些方法 但没有成功 任何帮助 将不胜感激 add filte
  • SELECT 列表中的所有列是否都必须出现在 GROUP BY 子句中

    我的讲师说 SELECT 列表中的所有列名必须出现在 GROUP BY 子句中 除非名称仅在聚合函数中使用 我只是想对此进行一些确认 因为我想不出一个合乎逻辑的解释来解释为什么它应该是真的 想象一下以下情况 A B C Cat 10 Fal
  • 有没有办法找出一个类是否是另一个类的直接基类?

    我想知道是否有办法找出一个类是否是另一个类的直接基类 即在 Boost 类型特征术语中is direct base of功能 据我所知 Boost似乎不支持这种功能 这让我认为当前的C 标准是不可能的 我想要它的原因是对用于反射系统的两个宏
  • 从视图中设置 cookie,然后从 Rails 中的控制器读取它

    我想使用 Javascript 从 Rails 视图中设置 cookie 值 然后使用 Controller 读取此 cookie Rails 可以做到这一点吗 我该怎么做 我的情况 我有一个输入字段 例如地址 用户第一次访问我的网站时需要
  • Hadoop、MapReduce - 多个输入/输出路径

    在为 MapReduce 作业制作 Jar 时的输入文件中 我使用 Hadoop local 命令 我想知道是否有一种方法 而不是专门指定输入文件夹中要在 MapReduce 作业中使用的每个文件的路径 我是否可以只指定并传递输入文件夹中的
  • Google App Engine 上的 Python Eggs

    通常我会使用virtualenv and pip用于部署 Web 应用程序 对于 Google App Engine 这是行不通的 因为所有import语句与应用程序的目录相关 我看到的最常见的方法是简单地从site packages到应用
  • Cordova:如何设置特定于平台的 config.xml 文件,该文件在 cordova 构建后不会被覆盖?

    我在 ios 和 android 两个平台上使用 Cordova 当我改变我的某些东西时 Project config xml 它将被合并到 Project platforms android res xml config xml Proj
  • 从 URL 缓存并保存 WebView 中的所有图像内容并加载

    我有在 Android 中运行的 Web 应用程序 我可以缓存我的网络 因此如果用户没有互联网连接 他仍然可以从缓存访问网络 但它仅在用户没有互联网连接时运行 现在 为了优化我的应用程序 当用户有互联网连接时 我想缓存所有显示的图像WebV
  • fflush 和 fsync 之间的区别

    我想fsync does fflush 在内部 所以使用fsync 在流上就可以了 但在网络 I O 下执行时我得到了意想不到的结果 我的代码片段 FILE fp fopen file wb multiple fputs calls lik
  • 如何创建书签以覆盖外部文件中的 html/div 层和 CSS

    我正在尝试找到一种方法来创建一个书签 它将 从外部文件 加载一个带有其他 html 和 css 的新图层 div 并将其覆盖在现有页面上 有人有可以分享的书签示例吗 我可以使用新的 html 内容和 CSS 类创建 div 我只是不确定如何
  • 从 Oracle Forms 中的 DLL (c#) 调用函数

    我在 Oracle Forms 6i 中从 DLL 调用方法时遇到了大问题 DLL已写入 C 代码如下 using System using System Collections Generic using System Linq usin
  • 我可以检查哪些函数模板已经或尚未实例化至少一次吗?

    我有很多模板代码 由于错误的模板代码除非经过编译 否则不会引发编译器错误 因此有什么方法可以检查编译器实际 编译 的模板函数以及完全忽略的模板函数吗 EDIT 2 如果一个特定的类模板 or 函数模板实例化一次 对于任何参数类型 都可以 我
  • Meteor's blaze 和 Famo.us 如何一起玩?

    2 技术 使用 blaze 模板引擎的 Meteor Famo us 及其出色的 GUI 框架 我来自流星方面 我个人喜欢使用 mustache 把手 从数据驱动 gui 反应式会话 数据库使得这非常高效和直观 现在famo us 及其所有
  • 使 FAB 不被夹在底部导航栏内

    我正在尝试将底部导航栏与 FAB 重叠 我希望我的导航栏看起来像这样 但它却像这样切断了按钮 如何防止FAB被切断 这是我的 XML
  • Twitterizer 2 和 C# - 找不到命名空间

    我对 Twitterizer2 有一个愚蠢的问题 可能还有我 我通过右键单击引用并浏览找到它们 从我的下载目录中添加了引用 twitterizer 2 3 1 以及 newtonsoft 然后我添加 using Twitterizer 你瞧
  • JQuery Mobile,加载表单提交页面时出现问题

    我正在开发我们网站的移动视图 我正在尝试实现 JQuery 移动版 但我发现两个问题可能会阻止我继续 并希望你们中的一些人有见解 许多页面都是通过搜索打开的 但是 当从搜索框调出页面时 我无法将其加载为 rel external 因此页面通
  • 在 C#.NET 中使用 USB PS2 手控器

    我正在尝试创建一个程序 该程序从 USB PS2 手持控制器获取输入 转换信息并将其传递到 RS232 设备 我已经完成了 rs232 设备的所有工作 问题出在与 USB 控制器的接口上 似乎没有任何好的文档 而且 NET3 0 3 5 也
  • AppCompat 23.3 支持向量不再起作用?

    我正在使用添加的支持向量绘图支持库23 2 http android developers blogspot com 2016 02 android support library 232 html与 AppCompat 一起 我正在使用矢
  • C中的getchar()无需按Enter键即可完成

    From my 上一篇文章 https stackoverflow com q 27297811 3429430 我知道 getchar 仅当我们按 Enter 时才完成 让我们考虑一下这段代码 include