为什么使用 fgets 时要输入 3 次 EOF?

2023-12-30

所以基本上我想将我写入标准输入的所有内容(包括换行符)复制到字符串以用于哈希目的。我设法做到了这一点,并编写了一些小代码来代表我的问题。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BUFFERSIZE 10000

int main()
{
char *myStr = calloc(1,1);
char buffer[BUFFERSIZE];

while( fgets(buffer, BUFFERSIZE , stdin) != NULL ){
  myStr = realloc(myStr, strlen(myStr)+1+strlen(buffer) );
  strcat( myStr, buffer );
}
printf("\n%s\n",myStr);

}

当我输入一些文本然后按 ENTER 键并在调用 EOF 之后,一切正常。

But when I start program enter "a" then I try to call EOF (using Ctrl Z + (Windows cmd prompt), Ctrl D (Linux)) I have to do it three times for program to actually break the loop. I was expecting maximum of 2 times.

有人可以解释如何使用 EOF、stdin 和 fgets 工作吗?或者我应该使用其他东西(例如 getline)?如果我不清楚我的问题,我很抱歉,请询问您需要的任何内容。

谢谢。


首先,^Z 或 ^D 是控制字符,对您正在使用的终端有意义,并且有时这意味着终端发出文件结束信号。

无论如何,输入文本后,终端会处理您的三个按键以执行以下操作:

  1. 刷新输入(即将已输入的字符从终端发送到程序 - 默认情况下,这不会发生,因为终端使用行缓冲)
  2. 设置文件结束条件
  3. 再次设置文件结束条件

在您的程序中对应于:

  1. 什么也没发生:尽管a已收到,fgets继续读取直到文件结尾或换行符
  2. fgets由于文件结束而完成。但是它不会返回 NULL,因为读取了字符,"a"再具体一点。
  3. 旧版本 glibc 中的一个错误 https://sourceware.org/bugzilla/show_bug.cgi?id=1190 causes fgets尝试再次读取,即使它之前已到达文件末尾。fgets由于文件结束而完成,并返回NULL因为没有读到任何字符。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用 fgets 时要输入 3 次 EOF? 的相关文章

  • #include 在 ubuntu 中“没有这样的文件”

    当使用 g std c 0x Wall test cc o hello 编译时 输出致命错误 cstdatomic 没有这样的文件或直接 哪里不见了 包含内容应该是 include
  • 如何指定CMAKE外部项目的编译器?

    我使用ExternalProject Add 包含一个外部项目 我想要的是能够做到 cmake DCMAKE CXX COMPILER
  • ZedGraph 缩放和调整大小

    当我绘制图形 放大和缩小并重新绘制图形时 图形的位置不会改变 我想要做的是 每当重新绘制数据时 视图都会更改以查看所有图形数据 如果您在重绘之前放大或缩小 这似乎会被禁用 Thanks 设置属性 IsZoomOnMouseCenter对于控
  • 当“”可以分配给std::string时,为什么有“clear”方法?

    一个可以用string clear函数清空字符串 也可以使用空双引号 来执行此操作 有什么不同 当您分配一个空字符串时 编译器必须在数据部分存储一个空的 C 字符串 并创建代码以将指向它的指针传递给赋值运算符 然后 赋值运算符必须从数据部分
  • C++17 中带有 noexcept 的 std::function

    在 C 17 中noexcept 已添加到类型系统中 http www open std org jtc1 sc22 wg21 docs papers 2015 p0012r1 html void r1 void f noexcept f
  • 将内核链接到 PTX 函数

    我可以使用 PTX 文件中包含的 PTX 函数作为外部设备函数 将其链接到另一个应调用该函数的 cu 文件吗 这是另一个问题CUDA 将内核链接在一起 https stackoverflow com questions 20636800 c
  • 两个 mysql_fetch_array 语句

    是否有任何原因导致我无法在一个 while 循环中包含两个处理两个不同 mysql 查询结果的 mysql fetch array 语句 原因是我有两个来自 mysql 数据库的查询结果 每个结果包含两列 如下所示 Query 1 Date
  • 有哪些 API 可在 Windows 中使用 C# 配置扬声器设置?

    我环顾了很多不同的地方 但似乎找不到一个简单的方法来做到这一点 我在 Windows 7 中有多个声卡 并使用 HDMI 将声音输出到我的 AVR 放大器 我遇到的问题是 当放大器关闭时 它会导致窗口丢失扬声器配置 所以我想做的是编写一个小
  • .NET 中 IEqualityComparer 中 GetHashCode 的作用是什么?

    我试图了解 IEqualityComparer 接口的 GetHashCode 方法的作用 下面的例子取自MSDN using System using System Collections Generic class Example st
  • 整数与双精度算术性能?

    我正在编写一个 C 类来使用整数执行 2D 可分离卷积 以获得比双对应更好的性能 问题是我没有获得真正的性能提升 这是 X 过滤器代码 对于 int 和 double 情况都有效 foreach pixel int value 0 for
  • “volatile void function( ... )” 做了什么?

    我见过从语法角度来看 C 函数中 volatile 关键字有多少种用法 https stackoverflow com questions 7643528 how many usage does volatile keyword have
  • 编译器在函数名称前添加下划线前缀的原因是什么?

    当我看到 C 应用程序的汇编代码时 如下所示 emacs hello c clang S O hello c o hello s cat hello s 函数名称以下划线作为前缀 例如callq printf 为什么这样做以及它有什么优点
  • 适用于 Windows 的键值数据库?

    除了 MongoDB 和 Memcached 之外 Windows 上还运行哪些键值存储 我见过的大多数似乎只能在 Linux 上运行 Hypertable Redis Lightcloud 相关链接 是否有经过商业验证的云存储 Key g
  • 在标准库中静态链接时如何支持动态插件?

    假设一个应用程序myapp exe是使用构建的g 它使用标志 static libstdc 这样就可以安装在没有环境的情况下libstdc so myapp exe还添加了对某些功能的插件支持plugf可以通过动态加载dlopen来自共享库
  • C# Linq 可以做组合数学吗?

    我有这个数据结构 class Product public string Name get set public int Count get set var list new List
  • Windows Phone HttpClient PostAsync 挂起且无响应

    我在拨打电话时遇到问题HttpClientWP 应用程序的 post 方法 PostAsync总是挂起并且不给出任何响应 当我从 WPF 应用程序中尝试时 相同的代码可以工作 这是我正在做的事情 服务器Web API代码 public cl
  • 在发送传出请求之前将新的 SoapClient 绑定到特定 IP 地址

    假设应用程序所在的计算机具有 SoapClient 具体来说 我正在使用 Microsoft Web Service3 Messaging SoapClient 它通过发送传出请求并获取 SoapEnvelope 作为回报 完善的流程 与远
  • MonoGame 中的 ContentLoadException

    我一直在尝试使用 Xamarin Studio 在 MonoGame 中加载纹理 我的代码设置如下 region Using Statements using System using Microsoft Xna Framework usi
  • 通过 OCI 调用 Oracle 存储过程并使用 C++ 中的 out ref 游标返回结果

    我想使用 OCI 接口从 C 调用 Oracle 存储过程 并使用 out SYS REF CURSOR 作为过程的参数来迭代结果 我是 OCI 新手 所以可能会遗漏一些简单的东西 大部分代码取自这里 我的存储过程是 CREATE OR R
  • 如何通过Task.ContinueWith创建传递?

    我想在原始任务结束时添加一个任务 但想保留原始结果和类型 附加任务仅用于记录目的 例如写入控制台等 例如 Task Run gt DateTime Now Hour gt 12 Hey throw new Exception Continu

随机推荐

  • 更改输入焦点上占位符范围的字体颜色

    我有一个输入字段 里面有一个跨度占位符 我想做的是在单击输入字段时更改占位符的颜色 这是一个 jsFiddle 其中包含我的领域的示例 http jsfiddle net Vbnj2 http jsfiddle net Vbnj2 最好的方
  • 在 C# 中将 Html 转换为 Docx [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 C 中将 html 页面转换为 docx 我该怎么做 我的解决方案使用Html2OpenXml
  • 使用node.js从Firestore中的子集合中删除文档

    我想从 Firebase 子集合中删除文档 我尝试通过以下方式做到这一点 firestore collection categories doc categoryId collection books doc bookId delete 但
  • 为什么插入排序是排序或近似排序数组的最佳算法?

    所以我猜它是因为它只是比较 A k 和 A k 1 并在一次扫描中实现 但它仍然不清楚 有人可以更好地解释一下吗 谢谢 This link http www sorting algorithms com 显示了一个不同类型数据集排序算法的图
  • Blazor - 比较上一个和下一个状态

    我在 Blazor 中有一个学生表 它来自 api 我还收到推送数据来更新学生信息 这基本上是数据库更改后的分数 推送工作正常 分数为正在更新 但我还想将分数更改后表中已更新的字段的背景颜色更改为仅 td 标签的红色几秒钟 我的代码如下 f
  • 在 Bootstrap 面板上调用事件展开

    我正在开发一个流程 我们使用 Bootstrap 风格的手风琴 不是 jQuery UI 手风琴 要求是当用户展开手风琴时调用服务 这是 HTML div class accordion dashboard div class panel
  • 如何清除 WPF WebBrowser 中特定站点的 cookie?

    如何删除特定网站或其页面的身份验证 cookie 目前 如果我通过 WPF WebBrowser 使用 OAuth 2 0 登录 我的登录会话将被保存 但我想在每次关闭应用程序时重置会话 public partial class VKLog
  • 使用 Retrofit2 以表单 urlencoded 请求发送对象列表

    这是我的邮递员请求 我将使用 Retrofit2 Gson 和 RxJava2 发送 POST 请求 这是我的要求 FormUrlEncoded POST Student I m sure the address and name are
  • React Native - 禁用 iOS 键盘上的密码自动填充选项

    在 React Native 中 如何禁用或阻止键盘显示密码自动填充附件视图选项 好像没有房产文本输入处理禁用此选项 React Native TextInput 文档 https facebook github io react nati
  • 连接两个模型以将数据放入视图中

    完成MVC菜鸟警告 2小时学习时间 我在网上查看了很多 MVC3 示例 但没有找到一个简单的示例来完成我想做的事情 我想要做的是两个连接两个模型并将一些数据放入视图中 最明显的是 public partial class Model1 pu
  • 如何在 Three.js 中将 SVG 文件加载到 SVGRenderer 中

    我正在尝试使用SVGRenderer在三个 js中 http trijs org examples svg sandbox http threejs org examples svg sandbox 该示例向您展示了如何动态创建 SVG 元
  • 是否可以将单词附加到现有的 OpenNLP POS 语料库/模型中?

    有没有办法训练现有的 Apache OpenNLP POS Tagger 模型 我需要向模型添加一些特定于我的应用程序的专有名词 当我尝试使用以下命令时 opennlp POSTaggerTrainer type maxent model
  • Google Drive API:以编程方式登录

    我正在开发将文件上传到 Google Drive 所需的应用程序 我从以下链接开始学习 API https developers google com drive ios quickstart https developers google
  • 在 Postgres 中使用 rowversion 实现增量客户端更新

    我是 Postgres 的新手 到目前为止我很喜欢它 我已经对这个问题进行了很多思考 RTFM 已尽我所能 但陷入了死胡同 所以我需要在正确的方向上推动 我正在设计一个数据库 其中每个感兴趣的实体都有一个rowversion从全局序列中获取
  • 如何设置 docker 在每个构建步骤中使用注册表中的缓存

    我有两台带有 docker 的服务器和一台带有我的私人注册表的服务器 我在第一台机器上构建了 Dockerfile 然后我将图像推送到注册表 是否可以使用注册表中的缓存立即在第二台计算机上构建 Dockerfile 如果没有 有没有什么方法
  • Firebase“无法将 java.util.HashMap 类型的值转换为 int”

    在我的代码中的这一行OnDataChange 方法中的ValueEvenListener int latest dataSnapshot getValue Integer class 我得到了一个DatabaseException与错误Fa
  • 将 uint8 数组合并到 uint64 错误

    我正在尝试这段代码 首先将 uint64 数字拆分为 uint8 数组 然后将所述数组合并回原始数字 但是当我尝试打印出号码时out 它似乎返回 uint64 的最大值 uint8 buf 8 uint64 test 12345678901
  • React Native 生成​​视频 url 的缩略图

    我有一些视频 我想在用户单击它们以观看完整视频之前将其显示为缩略图 他们不是本地的 我只有网址 有没有 RN 组件可以做到这一点 RN Image 组件不将视频 url 作为源 可以使用世博会视频缩略图库 https docs expo i
  • Rails 4 自定义 404 导致 Heroku 上的 postgresql 连接失败

    我在生产环境中的 Heroku 上部署了一个带有自定义域的 Rails 4 应用程序 我还有一个暂存版本 该应用程序使用舒适的墨西哥沙发 出现以下问题 应用程序将达到所有请求都返回 500 错误的状态 日志显示 jesse Athens e
  • 为什么使用 fgets 时要输入 3 次 EOF?

    所以基本上我想将我写入标准输入的所有内容 包括换行符 复制到字符串以用于哈希目的 我设法做到了这一点 并编写了一些小代码来代表我的问题 include