为什么 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' 之前不起作用? 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 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