为什么 EOF(文件结尾)在行尾没有 '\n' 之前不起作用?

2023-12-20

于是我开始用ANSI C的书来学习C。本书的早期练习之一是编写一个程序,该程序接受文本输入并在新行上打印每个单词,这很简单。所以我做了:

#include <stdio.h>

#define IN 1
#define OUT 0

 main() { 

    int c;
    int state;

    state = OUT;

    while((c = getchar()) != EOF){
        if(c != ' ' && c != '\n' && c != '\t'){
            state = IN;
        }else if(state == IN){
            state = OUT;
            putchar('\n');
        }
        if(state == IN)
            putchar(c);
    }

     getchar();
 }

问题是,虽然程序运行良好,但如果我输入,它不会从 while 循环中中断EOF(在 Windows 上按 Ctrl+Z)作为行的最后一个字符或在行的中间。

所以我找到了答案here https://stackoverflow.com/questions/11944314/ctrl-d-didnt-stop-the-whilegetchar-eof-loop.

我了解到的是 (Ctrl+Z) 字符是某种结束流的信号,它必须位于新行上getchar()回来EOF。虽然这一切都很好,而且有点帮助,但我真的想知道为什么有必要EOF独行?


您遇到的问题与命令行终端有关,与文件结尾标记本身无关。大多数终端不会在您键入字符时将字符发送到程序,而是会等到您完成整行后再将键入的内容发送到程序。

您可以通过让输入来自文本文件而不是手动输入来测试这一点。您应该能够在没有换行符的情况下结束输入文件,不会出现任何问题。

./myprogram.exe < input.txt

顺便说一句,您链接到的答案还指出 EOF 并不是输入流中实际存在的字符,因此它无法出现在“\n”“之前”。 EOF 只是这个值getchar一旦没有剩余字符可供读取,则返回。

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

为什么 EOF(文件结尾)在行尾没有 '\n' 之前不起作用? 的相关文章

  • 在C语言中使用“void”

    我很困惑为什么我们需要通过void转换为 C 函数 int f void return 0 versus int f return 0 什么是正确的做法以及为什么 In C int f 是一种老式的声明 它说f需要固定但未指定数量和类型的参
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • g++ 对于看似不相关的变量“警告:迭代...调用未定义的行为”

    考虑以下代码strange cpp include
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触

随机推荐

  • Spock - 提取方法的交互

    spock 文档指出您可以提取以下断言then阻止其他方法并添加assert每个断言之前的关键字 我也想要提取辅助方法的交互 我尝试将交互与interaction关闭块但这不起作用 是否可以 如果是怎么实现呢 事实证明你可以 您必须通过交互
  • 如何使用 XQuery/T-SQL 解析包含嵌套默认命名空间的客户 xml

    我有一个客户使用我们开发的平台 该平台允许客户 Web 服务返回数据由 MSSQL 中的存储过程进行解析 我们有一位客户发回 xml 其中包含针对不同 URI 位置的嵌套 xmlns xxxxxx 声明 首先这有效吗 其次是否可以使用 XQ
  • 应用程序域地址空间

    首先 问题是 CLR 规范是否保证在同一进程内的多个应用程序域中执行的代码将共享相同的地址空间 通过 共享地址空间 我的意思是指向在其中一个应用程序域中分配的内存的指针对于跨同一进程内托管的所有应用程序域的读写都是有效的 考虑这个说明问题的
  • NestedScrollView 内的多个 Recyclerview 不会发生视图回收

    我在管理多个项目时遇到了问题Recyclerview回收内部NestedScrollView 让我告诉我我正在尝试做什么 我有两个框架布局 即框架 1 和框架 2 我有两个包含 recyclerview 的片段 第一个片段的 recycle
  • 自定义导航栏样式 - iOS [重复]

    这个问题在这里已经有答案了 可能的重复 如何在iPhone导航栏上添加背景图片 https stackoverflow com questions 1692487 how to add background image on iphone
  • 有没有关于使用 ARC 对性能影响的具体研究?

    我找不到关于现实项目中 ARC 性能影响的客观研究 官方文档 http developer apple com library mac releasenotes ObjectiveC RN TransitioningToARC Introd
  • Spring Boot处理类型不匹配错误

    我使用的是 Spring Boot 2 1 5 并且有一个映射到从表单提交的数据的类 该类有一个整数字段 class FormData private Integer id 当我发送类型错误的有效负载时 例如 id aaaa Spring默
  • Paint.Net 是否仍然提供其源代码[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 Paint Net 曾经提供其来源的链接 但我找不到它 尽管我记得该链接很难找到 有谁知道他们是否不再提供来源 我只是将其作为 Net 应用程序来寻找
  • 将分区数据集写入 HDFS/S3,每个分区中包含 _SUCCESS 文件

    将分区数据集写入 HDFS S3 时 成功完成后会将 SUCCESS 文件写入输出目录 我很好奇是否有办法将 SUCCESS 文件写入每个分区目录 目前 您可以通过直接将文件写入到path to table partition key1 f
  • 如何使用 ARM 模板为我的 Azure Web 应用程序设置“仅限 Https”?

    我知道怎么设置仅限 https在 Azure 门户中手动 导航至我的 Web 应用程序 gt 自定义域在 Azure 门户中打开 自定义域 窗格 其中有一个 仅限 Https 选项 将此选项设置为 打开 可启用我正在寻找的功能 我发现如何手
  • Dart - 对 Base64 字符串进行编码和解码

    如何原生转换string gt base64 and base64 gt string 我只找到这个字节到base64字符串 http www dartlang org docs dart up and running contents c
  • 在 SwiftUI 中的 2 个子视图之间共享 @State var Bool

    我是一名设计师 我尝试学习 SwiftUI 是为了好玩 也是为了确保我更多地了解我的开发团队需要我做什么 有一些非常简单的事情我就是做不到 正如您从下面的这段代码中看到的 我只想在 var showHello 为 true 时显示文本 并且
  • 第一范式和时间数据

    第一个范式表示行顺序不重要 这是否意味着以日期作为键一部分的表不是 1NF 例如 考虑一个股票价格表 其中日期 时间是 PK 的一部分 在本例中 您可以通过按日期对数据进行排序并选择顶部的 1 行来获取最后的价格 这是否意味着为了满足 1N
  • 如何根据条件进行正则表达式匹配?

    我正在尝试制作一个条件正则表达式 我知道还有其他关于堆栈溢出的帖子 但问题太具体了 问题 如何创建一个仅在给定条件下匹配某些内容的正则表达式 一个例子 一个例子是 如果我们有一个字符串列表 这是在java中 String nums 42 3
  • WinRT:如何确保图像在画布上以像素完美的方式绘制?

    我正在添加Image http msdn microsoft com en us library windows apps windows ui xaml controls image aspx实例到Canvas http msdn mic
  • React/Redux 调度不触发减速器

    努力从我的 React 组件中调度一个操作 这是我的第一个 Redux 应用程序 一切似乎都工作正常 但如果是的话我就不会发布这个问题 我正在使用 Redux devTool 来调试我的应用程序 如果我使用 devTools 中的调度程序
  • 如何用Java制作一个简单的元音计数器方法?

    这是我的方法 public char ReturnAllVowels String word for int i 0 i lt word length i if word contains a e i o u 它说 不能应用于 String
  • Preg_match 到正则表达式等效表达式以匹配任何 Unicode 字母

    我被困在preg match vs regex 我正在尝试验证客户端的用户输入值 对于他们的名字和姓氏 我有这个表达方式 适合preg match p L s ui lt working fine with preg match 我需要 J
  • 我如何通过迁移的帮助将数据插入表中,并且该表是之前通过另一个迁移生成的

    我有一个包含用户名 角色和公司的角色表 我想通过新的迁移文件将数据插入到该表中 那么我该怎么做 我得到了这样的代码 但我如何使用它以及我无法理解的地方 class Foo lt ActiveRecord Migration def self
  • 为什么 EOF(文件结尾)在行尾没有 '\n' 之前不起作用?

    于是我开始用ANSI C的书来学习C 本书的早期练习之一是编写一个程序 该程序接受文本输入并在新行上打印每个单词 这很简单 所以我做了 include