为什么应该使用 strtok(line, "\n") **不** 来去除 fgets() 留下的换行符

2024-02-12

fgets()是读取一行输入的安全函数,但它存储new line byte '\n'如果适合,则从数组中的文件中读取。

在许多(如果不是大多数)情况下,这new line在进一步处理该行内容之前必须将其删除。

可以使用几种简单的方法来实现这一点,但我看到了一个紧凑而棘手的建议:

strtok(line, "\n");    // strip the newline

为什么这个方法不正确并且并不总是有效?


该方法很棘手,因为strtok()函数对全局隐藏状态变量有副作用。这可能会影响周围的代码并且难以调试。

此外,还有一个简单的情况,strtok(line, "\n")不会覆盖'\n'带有空字节:如果读取的行fgets()是一个空行,仅包含一个new line字节。对于这个内容,strtok()将跳过初始的new line,搜索不存在的不同字符,然后返回NULL not修改数组。因此它不会剥离new line.

这是不使用的令人信服的理由strtok(line, "\n")剥离new line byte.

当然可以fix这个问题通过写:

   if (*line == '\n')
       *line = '\0';
   else
       strtok(line, "\n");

或者是一些繁琐的俏皮话:

    (void)(*line == '\n' ? (*line = '\0') : (strtok(line, "\n"), 0);
    if (!strtok(line, "\n")) *line = '\0';
    (void)(strtok(line, "\n") || (*line = '\0'));

但代码不再紧凑,并且仍然有其他副作用。

还可以使用其他方法:

  • 使用显式的for陈述:

      for (char *p = line; *p; p++) {
          if (*p == '\n')
              *p = '\0';
      }
    
  • using strlen():

      size_t len = strlen(line);
      if (len > 1 && line[len - 1] == '\n') {
          line[--len] = '\0';
      }
      // len is the length if the stripped line
    
  • using strchr():

      char *p = strchr(line, '\n');
      if (p) {
          *p = '\0';
      }
    
  • using strcspn()一行:

      line[strcspn(line, "\n")] = '\0';  // strip the newline if any.
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么应该使用 strtok(line, "\n") **不** 来去除 fgets() 留下的换行符 的相关文章

  • 多个源的 makefile

    在学习 make 文件时 我试图为多个源目录编写一个 make 文件 似乎我在某个地方错了 这是我的代码结构 directory common fun2 c inc fun h src fun1 c main c 这是我的生成文件 CC c
  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • 如何在另一个应用程序中挂钩 api 调用

    我正在尝试挂钩另一个应用程序的 ExtTextOut 和 DrawTextExt GDI 方法调用 我知道我需要使用 GetProcAddress 来查找 gdi32 dll 中那些方法的地址 并用我的函数的地址覆盖我想要挂钩的进程中的地址
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 一元 +/- 运算符如何可能导致“-a”或“+a”中的整数提升,“a”是算术数据类型常量/变量?

    这句看似微不足道的台词摘自我的迈克 巴纳汉和布雷迪的 C 书 第 2 8 8 2 节 http publications gbdirect co uk c book chapter2 expressions and arithmetic h
  • C# 开源 NMEA 解析器 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 开源 NMEA 解析器 嗯 我自己也不熟悉 但是一些快速搜索显示了一个代码项目 htt
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • 使用故事板时重用 UIViewController 实例

    我决定在我当前的 iPhone 应用程序中尝试使用故事板 我面临着一些问题 我真的需要重用我的 UIViewController 实例 我这么说是什么意思 好吧 例如我有一个表视图控制器 当我点击一个单元格时 另一个视图控制器将从故事板加载
  • Google + 环聊按钮

    我正在尝试将 google Hangout 按钮添加到我的 html 文件中 如下所示 但是当我运行 html 页面时 该按钮不显示 div div
  • 在 Vim 中,文件名的制表符补全不起作用

    当我尝试在 Vim Linux 中打开文件进行编辑时 当我按 TAB 时 Vim 仅使用当前目录中的文件名自动补全文件名 然而 在网上搜索后 我认为从版本 7 开始 Vim 应该支持使用搜索路径中所有目录中的文件名进行类似 bash 的文件
  • 提升灵气属性传播

    我的 Boost Spirit Qi 语法有问题 该语法发出不需要的类型 导致此编译错误 error C2664 std basic string lt Elem Traits Ax gt std basic string lt Elem
  • 媒体编解码器 4.1 问题

    根据我的测试 除了 Nexus5 moto G 之外 它在大多数设备上都能正常工作 在这些设备上 应用程序生成仅包含两帧的视频 并且 还收到以下错误日志 OMX qcom video encoder avc storeMetaDataInB
  • 从 VBA 搜索 Outlook 电子邮件

    给定的代码成功运行 它在 Outlook 的 已发送邮件 文件夹中搜索电子邮件主题 搜索基于特定时间段内的特定日期进行 例如 下面的代码查找 2018 年 7 月 20 日中午 12 00 到晚上 11 59 之间发送的标题为 周五发送的测
  • 我如何知道 Eclipse 插件使用了多少内存(单独)

    有没有办法知道每个 Eclipse 插件分别消耗了多少内存 进行堆转储并使用例如进行分析这Eclipse 内存分析器 http eclipse org mat 有关更多信息 请参阅使用内存分析器分析 Equinox 捆绑包依赖性 http
  • 如何检查pandas数据框中的布尔条件

    I have Alcohol df数据框 其中资格是一列 我创建了一个列表 如下所示 Graduate list B tech b tech b tech Btech BE B E b e BACHELOR bachelor BSc Bsc
  • 如何使用“PerformanceNavigationTiming” API 获取页面加载时间?

    我正在尝试使用PerformanceNavigationTiming API https developer mozilla org en US docs Web API PerformanceNavigationTiming生成页面加载指
  • 从 travis CI 获取作业 ID 的日志文件

    如何从作业 ID 和项目名称下载构建日志文件 我知道 travis ci 有 API 项目名称 eclipse jetty project 职位编号 6073028 访问日志文件的链接 https travis ci org eclipse
  • 如何处理spark sql中缺失的列

    我们正在处理无架构的 JSON 数据 有时 Spark 作业会失败 因为我们在 Spark SQL 中引用的某些列在一天中的某些时间不可用 在这些时间内 Spark 作业会失败 因为所引用的列在数据框中不可用 如何处理这种情况 我已经尝试过
  • 可以从纹理生成法线贴图吗?

    如果我有一个纹理 是否可以为该纹理生成法线贴图 以便它可以用于凹凸贴图 或者法线贴图通常是如何制作的 是的 嗯 有点像 法线贴图可以根据高度贴图精确制作 一般来说 您也可以放置常规纹理并获得不错的结果 请记住 还有其他制作法线贴图的方法 例
  • 是否可以在 Julia 中对字典进行排序?

    我使用两个数组创建了一个字典zip like list1 1 2 3 4 5 list2 6 7 8 9 19 dictionary1 Dict zip list1 list2 现在我想按以下顺序对这本词典进行排序key list1 or
  • Oracle:比较包含 CLOB 的表并获取 diff 的最快方法

    假设我有两个表 其中列 Col1 Col2 和 Col3 均为 VARCHAR2 CLOB和 NUMBER 类型分别 我怎样才能得到这些表的差异 即存在于Table B 但不在Table A Table A Col1 Col2 Col3 P
  • 使用带有 React-bootstrap 的 Nav 组件的手风琴侧边栏菜单

    我开始使用构建我的用户界面react bootstrap现在我有一个重要的任务是使用标准创建侧栏手风琴菜单bootstrap成分 我发现this http bootsnipp com snippets featured accordion
  • 如何让 JavaScript 在当前显示器上打开弹出窗口

    设想 用户有两个显示器 他们的浏览器在辅助显示器上打开 他们单击浏览器中的一个链接 该链接调用 window open 并具有特定的顶部和左侧窗口偏移量 弹出窗口始终在其主显示器上打开 JavaScript 有没有办法让弹出窗口在与初始浏览
  • 使用 iTextSharp 获取指定区域中包含的文本出现次数

    是否有可能 使用iTextSharp 获取pdf文档指定区域中包含的所有文本出现 Thanks 首先 您需要用红色标记的矩形的实际坐标 乍一看 我认为 x 值 144 2 英寸 可能是正确的 但如果 y 值是 76 我会感到惊讶 因此您必须
  • 在asp.net mvc中将application/json绑定到POCO对象,序列化异常

    我将 json 从我的视图传递回我的控制器操作以执行操作 要将发送的 json 转换为 POCO 我使用此操作过滤器 public class ObjectFilter ActionFilterAttribute public Type R
  • 字典与对象 - 哪个更有效,为什么?

    在 Python 中 就内存使用和 CPU 消耗而言 哪个更高效 字典还是对象 背景 我必须将大量数据加载到 Python 中 我创建了一个对象 它只是一个字段容器 创建 4M 实例并将其放入字典大约需要 10 分钟 大约需要 6GB 内存
  • 为什么应该使用 strtok(line, "\n") **不** 来去除 fgets() 留下的换行符

    fgets 是读取一行输入的安全函数 但它存储new line byte n 如果适合 则从数组中的文件中读取 在许多 如果不是大多数 情况下 这new line在进一步处理该行内容之前必须将其删除 可以使用几种简单的方法来实现这一点 但我