fgets 实现 (K&R)

2023-11-25

我是编程新手,从 Objective-C 开始,但决定在进一步发展之前先回到基础知识。我花了一些时间在 C 上,并且正在努力克服指针混乱。我的问题是关于 K&R 所说的 fgets 是如何实现的(第 165 页,第二版)。下面的代码直接来自文本,并附有一些我的评论。

char* fgets(char* s, int n, FILE *iop)
{
    register int c;
    register char* cs;
    cs = s;

    while(--n > 0 && (c = getc(iop)) != EOF)
    {
    // put the input char into the current pointer position, then increment it
    // if a newline entered, break
    if((*cs++ = c) == '\n')
        break;          
    }

    *cs = '\0';
    return (c == EOF && cs == s) ? NULL : s;
}

1) 我们将 char* 传递给 fgets 函数,在该函数中我们存储用户输入。为什么需要声明本地char* cs - 然后初始化为s?为什么我们不能在 if 语句中直接操作/添加到 s ?既然cs被初始化为点s,那么将字符添加到cs不是完全相同的事情吗?

2) 与上面的联系在一起...当函数返回时,将进行测试以查看 cs == s 是否。为什么这是必要的?

我想我可能错过了一些非常基本的东西 - 我确实检查过SO和Google,但不太明白。谢谢!


这是因为最后一行的检查,cs == s。此比较检查修改后的指针cs反对原来的s看看我们是否读过任何字符。如果没有,那么我们返回 NULL。

通过使用cs整个原始指针s被保留。如果s被直接操纵(*s++代替*cs++)那么我们就必须找到另一种方法来检查是否读取了任何字符。

人们还可以争辩说,保留函数参数并将它们视为一种很好的做法const。一些程序员遵循这种做法来提高代码清晰度。

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

fgets 实现 (K&R) 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co

随机推荐

  • 如何在 Symfony 4 中覆盖第三方包的资源?

    我使用 Symfony Flex 进行了全新的 Symfony 安装 新的框架属于下一个 Symfony 4 目录结构 下一个 我将覆盖一些资源例如来自外部包的模板 翻译等 我尝试为模板创建所有这些路径 首先 但没有任何效果 templat
  • 如何在 git checkout 上仅恢复修改过的文件?

    假设我有一个包含数百个文件的目录 我修改了其中一些 但后来我意识到我的修改很糟糕 如果我做 git checkout whole folder 然后所有的东西都会被再次检查 我必须重新编译所有的东西 有没有办法让结账只影响修改过的文件 或者
  • LazyLoadingEnabled 设置似乎在 EF 5 中不起作用

    我首先将 EF 模型与 POCO 实体和自定义 DbContext 一起使用 我的问题是设置LazyLoadingEnabled false不会影响任何内容 导航属性仍会加载 下面是我的简化示例 实体计划 一个程序可以是其他程序的一部分 n
  • 如何在 Postgres 中搜索字符串中是否存在整个单词

    我有一张带有一列的桌子field具有像三星手机这样的价值 我的问题是 如果我搜索字符串 Samsung 或 phone 如何获得这一行 如果我只给出 Sam 或 ph 作为搜索词 我不想要任何结果 我曾尝试使用 ILIKE 运算符 但如果我
  • 在 VB.NET 中订阅事件

    我正在尝试将一些 C 代码转换为 VB NET 我在 C 中有以下内容 有效 m switchImageTimer new DispatcherTimer m switchImageTimer Interval Interval m swi
  • Java:将大量数据序列化到单个文件

    我需要将小对象的大量数据 大约 2gig 序列化到单个文件中 以便稍后由另一个 Java 进程处理 性能很重要 谁能建议一个好的方法来实现这一目标 你有没有看过谷歌的协议缓冲区 听起来像是它的一个用例
  • AMD多核编程

    我想开始编写应用程序 C 它将利用额外的核心来执行需要执行大量计算并且其计算彼此独立的代码部分 我有以下处理器 x64 Family 15 Model 104 Stepping 2 Authentic AMD 1900 Mhz 在 Wind
  • JavaScript 中的睡眠 - 操作之间的延迟

    有没有办法可以在 JavaScript 执行另一个操作之前让其休眠 Example var a 1 3 Sleep 3 seconds before the next action here var b a 4 您可以使用setTimeou
  • 如何在 xunit/autofixture 中组合 PropertyData 和 AutoNSubstituteData 属性?

    我正在使用 AutoNSubstituteData 属性 发布在这里 AutoFixture xUnit net 和自动模拟 我想将其与 PropertyData 来自 xunit 扩展的属性 这是我的测试 public static IE
  • 在 Android Studio Java 中读取文本文件

    我有一个类 QuoteBank 需要使用扫描仪读取 txt 文件 但它给了我一个文件未找到异常 java 文件位于 应用程序 src main java nate marxBros QuoteBank java txt 文件位于 应用程序
  • Django celery Worker 将实时状态和结果消息发送到前端

    在 django 应用程序中 我正在运行异步任务 并希望向用户显示进度 错误等 如果出现错误 则应将用户重定向到需要额外输入或执行某些操作才能解决问题的页面 从 celery 工作返回到前端的最佳通信方式是什么 这是伪代码的基本结构 vie
  • 如何将 C# 方法添加到现有的大型 wix 脚本中

    我们现有的 wix 脚本相当复杂且冗长 所有自定义操作均使用内联 vbscript 执行 我想将其中一些操作从 vbscript 切换到 C 各地的所有示例都以 在 VisualStudio 中创建一个 wix 项目 开头 有没有关于如何将
  • 构建并安装 x86_64 而不是 i386 的 Brew 应用程序?

    我完成此操作后 酿造安装git 我这样做 哪个git 返回 usr local bin git 然后我这样做 文件 usr local bin git 返回 usr local bin git Mach O 可执行文件 i386 我需要br
  • 数字和一位小数的正则表达式

    我似乎无法使用简单的正则表达式来工作 这是我目前所拥有的 Hours on input function e var regex d d 0 2 g if regex test this value if regex test this v
  • 获取变量名。 javascript“反射”

    有没有办法获取变量name 就像你可以在 Net 中使用反射做的那样 就像在这个场景中 function x y z if x 0 logger log variable x reflectedName has invalid value
  • 在应用程序域之间来回传递值

    我有以下代码 public class AppDomainArgs MarshalByRefObject public string myString static AppDomainArgs ada new AppDomainArgs m
  • 有关即将推出的 fork-join 框架的资源

    我正在寻找有关如何使用即将推出的 jsr166y fork join fences 和 extras166y ParallelArray 等 的组织良好的信息源 从教程到专家级别的内容 IBM Developerworks 网站有一个好系列
  • 如何写一个解释器?

    我决定用 Ruby 编写一个小型解释器作为我的下一个项目 我需要什么知识 技能才能成功 我还没有决定要解释的语言 但我正在寻找一种不是玩具语言 但相对容易编写解释器的语言 提前致谢 你至少必须学习 词法分析 将字符分组为标记 解析 将标记分
  • Bootstrap 缩略图中的垂直居中约束图像

    Using 推特引导程序 我正在尝试创建一个水平滚动的系列缩略图它允许在显示缩略图的行中使用滚动条 如下所示 使用以下 HTML 我可以完成大部分工作 div class row Hello there div div class row
  • fgets 实现 (K&R)

    我是编程新手 从 Objective C 开始 但决定在进一步发展之前先回到基础知识 我花了一些时间在 C 上 并且正在努力克服指针混乱 我的问题是关于 K R 所说的 fgets 是如何实现的 第 165 页 第二版 下面的代码直接来自文