为什么这个 getchar() 循环在输入一个字符后停止?

2024-01-06

#include <stdio.h>

int main() {
    char read = ' ';

    while ((read = getchar()) != '\n') {
        putchar(read);
    }

    return 0;
}

我的输入是f(当然,后面要输入回车键)。我预计getchar()再次要求输入,但程序被终止。怎么会?我怎样才能解决这个问题?


终端有时可能会有点混乱。您应该将程序更改为:

#include <stdio.h>

int main() {
    int read;
    while ((read = getchar()) != EOF) {
        putchar(read);
    }
    return 0;
}

这将一直读取到 getchar 从终端读取 EOF(大多数时候该宏扩展为 -1)。 getchar 返回一个 int,因此您应该将变量“读”为整数,以便您可以检查 EOF。您可以在 Linux 上使用 ^D 从终端发送 EOF,我认为在 Windows 上使用 ^Z (?)。

解释一下发生了什么。在你的程序中的表达式

(read = getchar()) !='\n'

只要没有从缓冲区读取 '\n' 就为 true。问题是,要获取程序的缓冲区,您必须按与“\n”相对应的回车键。 当您的程序在终端中被调用时,会发生以下步骤:

~$\a.out

这会启动你的程序

(empty line)                    

getchar() 进行系统调用以从终端获取输入,然后终端接管

f                   

您在终端中进行了输入。 “f”被写入缓冲区并在终端上回显,您的程序还不知道该字符。

f
f~$                 

你按下回车键。您的缓冲区现在包含“f\n”。 “输入”还向终端发出信号,表明它应该返回到您的程序。你的程序 读取缓冲区并找到 f 并将其放到屏幕上,然后找到 '\n' 并立即停止循环并结束程序。

这将是大多数终端的标准行为。您可以更改此行为,但这取决于您的操作系统。

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

为什么这个 getchar() 循环在输入一个字符后停止? 的相关文章

随机推荐

  • android ConstraintLayout 不允许负边距

    我相对于布局指南放置了很多项目 并希望将新项目放置在几乎与此布局指南相关的位置 我尝试使用负布局边距但没有成功 android translationX 10dp android translationY 10dp
  • Laravel:使用 AJAX 请求渲染部分视图

    我正在尝试制作一个单页 CRUD 应用程序 并且将 AJAX 与 jQuery 结合使用 在本例中 我提交表单并在数据库中异步存储一个新国家 地区 然后使用新数据渲染部分视图 这是我的脚本和从数据库检索国家 地区并返回部分视图的方法 cre
  • 写入错误:使用 O_DIRECT 打开文件时参数无效

    对我来说 用以下内容写入文件非常重要O DIRECT flag 这就是我打开文件的方式 Open the file int fd if fd open inFilepath O WRONLY O CREAT O SYNC O DIRECT
  • 在表达式中的 let .. 中使用守卫

    有时我会写这样的代码 solveLogic Int gt Int gt Int solveLogic a b let x 1 brainiac a gt x 1 a b 333 otherwise 5 in brainiac 每次我都想写这
  • IPython Notebook 之前的单元格内容

    是否可以在 IPython Notebook 单元格中获取上一个 上方 单元格内容 我可以使用 capture 魔术函数查看以前的输出 但我不知道如何获取以前的单元格内容 recall jupyter notebook cell numbe
  • 普通 Javascript 对象上的 jQuery.bind() 事件

    是否可以将 jQuery 事件绑定到普通的非 DOM Javascript 对象 var myobject myobject bind foobar function alert daa myobject trigger foobar 有何
  • 如何让下面的代码更快

    int u1 u2 unsigned long elm1 20 mulpre 16 20 res1 40 res2 40 64 bits long res1 res2 initialized to zero l 60 while l for
  • PHP Array_intersect 在具有未知数量键的多维数组上

    我正在尝试在拥有资源 人员 的应用程序中制作高级搜索过滤器 我在 1 个多维数组中得到了所有结果 该应用程序的用户可以搜索人员的职位名称 技能 工作领域和国家 地区 我已经完成了查找符合用户给出的标准的人的部分 这些结果存储在多维数组中 如
  • Android ACTION_GET_CONTENT 不更新下载目录文件

    我在选择文件时遇到问题下载目录使用ACTION 获取 内容 如果我删除本地存储中的 ES 资源管理器或文件管理器中的任何文件 这些删除的文件不会在下载在我的应用程序中打开时的目录 任何变化下载dir 没有反映在选择器中 要选择一个文件 我正
  • Angular 通用 html lang 标签

    在 Angular Universal 中 我有一个 index html 文件 顶部有 我想根据我所在的页面更改此设置 maldonadoattorney com es jailreleases 将是 maldonadoattorney
  • Django - 使用模板标签和“with”?

    我有一个自定义模板标签 def uploads for user user uploads Uploads objects filter uploaded by user problem upload False num uploads u
  • 基于支持向量的数据重采样器

    我正在努力实现一个数据重采样器以基于support vectors 这个想法是为了适应SVM分类器 得到support vector类的点 然后通过仅选择每个类的支持向量点附近的数据点来平衡数据 以使类具有相同数量的示例 忽略所有其他 远离
  • Google Plus API 错误gapi.loaded_0

    我尝试将 requireJS 与 Google plus API 一起使用 但是当我单击登录按钮时出现错误 这是错误和屏幕截图 GET https apis google com scs apps static js k oz gapi e
  • 如何在pytorch中使用LSTM进行分类?

    我的代码如下 class Mymodel nn Module def init self input size hidden size output size num layers batch size super Discriminato
  • 在非活动类中显示进度对话框

    我正在尝试在非活动类中显示对话框 基本上 我在我的应用程序中检测到一个对象 我想显示一个对话框 然后切换活动 我在 logcat 中收到 java lang RuntimeException 无法在未调用 Looper prepare 的线
  • 链接方法时如何返回 false

    我有一个使用方法链的验证类 我希望能够进行单次检查TRUE FALSE像这样 if obj gt checkSomething 但也有像这样的链方法 if obj gt checkSomething gt checkSomethingEls
  • 将代码转换为 R 中的函数

    我有一系列的步骤 我想将它们转换为函数 因此我只需通过调用它们即可将其应用于数据框 下面是带有一些注释的代码 library textreadr library pdftools library tidyverse library tidy
  • 函数上的模板模板参数

    这是 C 模板中的有效模板构造吗 template lt template
  • 在Qt中鼠标指针下选择Word

    当我在 QTextBrowser 中右键单击时 我需要突出显示并获取鼠标指针下的单词 我已经实施了显示上下文菜单函数为QText浏览器对于鼠标右键单击的事情 但是我无法突出显示鼠标指针下的单词并提取它 我在网上找到了如下解决方案 QText
  • 为什么这个 getchar() 循环在输入一个字符后停止?

    include