C 中的字符串分割器 - 它是如何工作的?

2024-01-22

我继承了一个庞大的代码库,并且有一个实用函数可以分割字符串:字符。我了解大约 80% 的运作方式,但我不明白*token = '\0'; line.

任何指点都将受到高度赞赏。

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

#define MAX_TOKEN_SIZE 200

const char *splitter(const char *str, char delimiter, char *token) {

    while (*str && (delimiter != *str)) {
        *token++ = *str;
        str++;            
    }
    if (delimiter == *str)
        str++;

    *token = '\0';    // what is this line doing?

    //how could the token be correct in the main() after setting it to null terminator 
    //here?

    return str;
} 

int main() {
    char token[MAX_TOKEN_SIZE + 1];  
    const char *env = "/bin:/sbin:::/usr/bin";
    while (*env) {
        env = splitter(env, ':', token);  

        //if token is empty, set it to "./"
        if ((token != NULL) && (token[0] == '\0')) {
            strcpy(token, "./\0");            
        }

        printf("%s\n", token)  ;
    }
    return 0;
}

输出正确:

/bin
/sbin
./
./
/usr/bin

首先,我将指出一个冗余代码。

这个 if 语句

if ((token != NULL) && (token[0] == '\0')) {

表情毫无意义,因为token永远不能等于NULL. tokenmain 中被声明为字符数组。所以你可以写

if ( token[0] == '\0') {

也在该语句的字符串文字中

strcpy(token, "./\0");

显式终止零字符'\0'是多余的。你可以只写

strcpy(token, "./");

至于你的问题。

功能splitter提取字符序列,直到字符delimiter遇到并将其存储在数组中token,

while (*str && (delimiter != *str)){
     *token++ = *str;
     str++;            
}

但结果序列并不代表字符串。它应以终止零字符结束\0和这个声明

*token = '\0'; 

将终止零字符附加到存储在数组中的提取序列的末尾token.

至于这个说法

if (delimiter == *str)
    str++;

那么如果它不是字符串的结尾str(也就是说,如果当前字符*str不是终止零字符 '\0';如果它等于delimiter那么它不是终止零字符)然后是指针str递增并从函数返回,以允许调用者在下一次调用函数时继续处理下一个位置的字符串。

所以最初你有

 const char *env = "/bin:/sbin:::/usr/bin";

该函数复制字符/bin附加零字符'\0'这是数组标记的字符串“/bin”。调用此函数后,函数返回的指针将指向子字符串

"/sbin:::/usr/bin"

因为前面的字符':'被该语句跳过

if (delimiter == *str)
    str++;

函数内。

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

C 中的字符串分割器 - 它是如何工作的? 的相关文章

  • InvalidOperationException - 对象当前正在其他地方使用 - 红十字

    我有一个 C 桌面应用程序 其中我连续创建的一个线程从源 实际上是一台数码相机 获取图像并将其放在 GUI 中的面板 panel Image img 上 这必须是另一个线程 如它是控件的代码隐藏 该应用程序可以工作 但在某些机器上 我会在随
  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐

  • 金字塔 1.3 和 Google 应用引擎 1.7

    我设法使 Pyramid 1 2 WSGI 应用程序在 Google App Engine SDK 1 7 上运行 然而 我当前的项目使用了几个新的 Pyramid 1 3 功能 并且我陷入了 WebOb 版本问题 这是错误消息 Versi
  • 无法联系 reCAPTCHA。检查您的连接并重试

    我正在使用react google invisible recaptcha 但当页面加载时它不起作用 它会显示 无法联系 reCAPTCHA 请检查您的连接并重试 之类的警报 即使互联网速度更快 我怎样才能使用invisible reCAP
  • VS2010 中缺少 ws2_32.lib。该怎么办?

    我正在尝试着手 Windows 套接字编程 我知道你必须 include winsock2 h然后链接到ws2 32 lib 问题是我没有ws2 32 lib在我的 Visual Studio 2010 终极版本中 我应该做什么才能让它启动
  • 在Matlab中将导数值保存在ode45中

    我正在模拟一个带有质量弹簧和双摆的 有点奇怪 系统的运动方程 我有一个质量矩阵和函数 f x 并调用 ode45 来求解 M x f x t 我有5个状态变量 q QDot phi phiDot r rDot 删除了 Q 因为没有任何东西依
  • C 中的连续空格删除 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 文本文件包含一堆字符 文件中没有制表
  • Javacv Blob 检测

    我想在我的应用程序中使用一些用 Java 编写的斑点检测 因此使用JavaCV代替OpenCV 我发现很多课程 例如 SimpleBlobDetector CvBlobDetector CvBlob 但我找不到任何教程或演示 示例代码来在
  • UINavigationController:相反方向弹出视图控制器

    我正在尝试打电话 self navigationController popViewControllerAnimated YES 但使动画从右向左滑动而不是从左向右滑动 有什么简单的方法可以做到这一点吗 我想回到之前的观点 任何帮助表示赞赏
  • 如何向 R matplot 添加颜色匹配的图例

    我使用 matplot 在图表上绘制几条线 matplot cumsum as data frame daily pnl type l 这给了我每行的默认颜色 这很好 但我现在想添加一个反映相同颜色的图例 我怎样才能实现这一点 请注意 我首
  • 为什么Flow需要对导出函数的参数进行注释?

    以下代码 流动游乐场 https flowtype org try 0PQKgBAAgZgNg9gdzCYAoVUCuA7AxgFwEs5swBDACgAcBKMAbwF9UBbOAE0xgFMA6bgB5U4AJ3wBnMAF5yQA f
  • 将 CollectionView Item VisualElement 的 VisualState 传递给其子 VisualElements

    我遇到以下情况 CollectionView 每一项都是Border 包含其他控件 选择后 边框的 VisualState 更改为已选择 然而 子控件的状态没有改变 有没有一种简单的方法可以将这些 VisualStates 链接 传递给所有
  • 使用递推方程的程序的时间复杂度

    我想使用递归方程找出程序的时间复杂度 那是 int f int x if x lt 1 return 1 else return f x 1 g x int g int x if x lt 2 return 1 else return f
  • 如何在 AntD Reactjs 中打开表格行按钮上的模态并访问模态中的表格数据

    我在 antd 表中显示用户数据 并在表中为每行创建了编辑按钮来访问每行记录 我想在 编辑 按钮单击时打开模态并在模态中获取相应的行数据 但无法 因为它给出了错误 showModal 未定义 版本 antd 4 18 9 axios 0 2
  • 在IOS中使用Web服务时出现NSURLSession内存泄漏

    我正在构建一个使用 Web 服务的应用程序 并从我使用的 Web 服务中获取信息NSURLSession and NSURLSessionDataTask 我现在处于内存测试阶段 我发现NSURLSession正在导致内存泄漏 这还不是所有
  • 使用 htaccess 文件删除文件扩展名 .php

    我想通过 htaccess 文件从 url 中删除 php 例如 home php 到 home 我在 htaccess 文件中使用以下重写规则 RewriteRule 1 php L 我还想将登录名指定为索引 我该如何改变它 这是可用于隐
  • 如何通过ajax使用Materialize自动完成插件?

    我正在努力共同努力MaterializeCSS 自动完成插件 http materializecss com forms html autocomplete使用我的 ajax 调用 以便根据输入字段中键入的内容动态加载数据 我的 ajax
  • 如何在 NumericUpDown 中保留有效值而不是分配最大值?

    假设我有 NumericUpDownMaximum 99 and Minimum 99和初始值 23 如果用户将焦点设置到此控件并输入1 那将是123现在 它改变了它的价值99 我该如何保留23而不是将值更改为允许的最大值 我尝试捕获 Ke
  • 什么是缓动函数?

    动画上下文中的缓动功能是什么意思 看来dojo jquery silverlight flex等UI系统都有缓动功能的概念 我找不到缓动函数的良好解释 任何人都可以解释缓动函数的概念 或者对它们给出一个很好的解释 我对这个概念感兴趣 而不是
  • 如何将 android.support.v7.* (appcompat) 导入到 AIDE

    任何人都知道如何将 android 支持导入 AIDE 编译器应用程序 经过大量时间的搜索并在 Alan Downie 的帮助下 感谢你 这里是使用 AppCompatActivity 与支持库版本 27 的说明 使用最新的支持库非常重要
  • 如何在 php 中反转数组而不使用数组反转方法

    我想知道如何在不使用 array reverse 方法的情况下反转数组 我有一个名为反向数组的数组 这是我想要反转的数组 我的代码如下 有人可以指出我做错了什么 因为我在其他地方找不到任何以这种方式反转数组的示例 我的代码如下
  • C 中的字符串分割器 - 它是如何工作的?

    我继承了一个庞大的代码库 并且有一个实用函数可以分割字符串 字符 我了解大约 80 的运作方式 但我不明白 token 0 line 任何指点都将受到高度赞赏 include