开发了 strtok 替代品

2024-01-23

我开发了自己的 strtok 版本。只是为了练习指针的使用。

任何人都可以看到这有任何限制,或者无论如何我可以改进。

void stvstrtok(const char *source, char *dest, const char token) 
{
    /* Search for the token. */
    int i = 0;
    while(*source)
    {
        *dest++ = *source++;
        if(*source == token)
        {
            source++;
        }
    }
    *dest++ = '\0';
    }

int main(void)
{
    char *long_name = "dog,sat ,on ,the,rug,in ,front,of,the,fire";
    char buffer[sizeof(long_name)/sizeof(*long_name)];

    stvstrtok(long_name, buffer, ',');

    printf("buffer: %s\n", buffer);

   getchar();

   return 0;
}

旁注:“令牌”一词通常用于描述返回的字符串部分。分隔符用于描述分隔标记的东西。因此,为了使代码更清晰,您应该将 token 重命名为 delimiter,并将 dest 重命名为 token_dest。

您的函数和 strtok 的差异:

您的函数和 strtok 之间存在一些差异。

  • 您的函数所做的只是删除令牌分隔符
  • 您只需调用一次函数即可处理字符串的所有部分。使用 strtok,您可以对字符串的每个部分多次调用它(后续多次使用 NULL 作为第一个参数)。
  • strtok 还会破坏源字符串,而您的代码使用自己的缓冲区(我认为最好像您一样使用您自己的缓冲区)。
  • strtok 在每次调用后存储下一个标记的位置,其中第一个参数为 NULL。该位置随后用于后续调用。但这不是线程安全的,并且您的函数将是线程安全的。
  • strtok 可以使用多个不同的分隔符,而您的代码仅使用一个。

话虽这么说,我将给出如何制作更好的函数的建议,而不是更接近 strtok 实现的函数。

如何改进你的功能(不是模仿strtok):

我认为最好进行以下更改:

  • 让您的函数仅返回“下一个”标记
  • 当您有 *source 或 *source == 分隔符时跳出循环
  • 返回指向包含下一个标记的源字符串的第一个字符的指针。该指针可用于后续调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开发了 strtok 替代品 的相关文章

随机推荐

  • Spark RDD 块在使用前被移除

    我正在使用 Future 对 RDD 执行阻塞操作 如下所示 dStreams foreach foreachRDD rdd gt Future writeRDD rdd 有时我会收到此错误 org apache spark SparkEx
  • Delphi IAccessible Get_accState 影响 Get_accName?

    我目前正在将 IAccessible Interface 添加到派生的 VCL 组件中 以便能够为我的应用程序实现自动化 UI 测试 实现接口后 我没有看到通过外部工具读出的组件属性中的名称 尽管我在调试时看到它已设置 经过 一些 或更可能
  • 在 ARCore 中添加的垂直平面上的对象始终旋转

    我正在 Sceneform ARFragment 中的垂直平面上添加图像 但它总是会旋转 该代码在水平面上运行良好 我将图像放置在垂直平面上的代码如下 arFragment setOnTapArPlaneListener hitResult
  • PHP 中的类模板就像 C++ 中的一样

    可以在中创建类模板PHP as in C PHP可能没有类似的语言结构 比如template中的关键词C 但也许有一些巧妙的技巧可以实现类似的功能 我有一个Point我想将其转换为模板的类 在类中 我使用类型参数 因此 对于每个类 我想传递
  • PHP 启动:无法加载动态库 'C:\xampp\php\ext\php_oci8_12c.dll' - 找不到指定的程序

    我们在php中连接oracle服务器面临一个大问题 我做了什么 Setp 1 安装 Windows 7 32 位 第2步 安装 XAMPP 32 包括 Apache 2 4 29 PHP 7 1 11 phpMyAdmin 4 7 4 Op
  • C++0x |为什么 std::atomic 使用 volatile 限定符重载每个方法?

    以下摘录自当前草案 说明了我的意思 namespace std typedef struct atomic bool bool is lock free const volatile bool is lock free const void
  • 使用 ExecuteNonQuery() 时返回值不正确

    我正在编写一个与 SQL Server 交互的 C 程序 我愚蠢地将查询字符串硬编码到 C 程序中 并希望将它们转换为服务器上的存储过程 由于某种原因 一个特定的 INSERT 语句 工作正常 不再有效 我不明白为什么 我什至运行了 SQL
  • 如何从十进制字符串中去掉零和小数点?

    当前输出以下代码 12 1 12 100 12 1000 12 00 12 12 0000 我怎样才能改变它 让它输出 12 1 12 1 12 1 12 12 12 Math Round 似乎就是这样 但它让我定义了我想要的小数位数 但我
  • Android java 百分比位图两幅图像之间的像素差异

    我需要在Android上的java中计算两个图像之间的像素差异 问题是我的代码返回不准确的结果 例如 我有 3 张非常相似的图片 但对于每张图片的比较 它返回显着不同的结果 pic1 vs pic2 1 71 pic1 与 pic3 0 0
  • 如何使用 Prisma 加密和解密数据?

    我已经研究了几周并寻找解决方案 但找不到针对我的具体问题的解决方案 我的前提 我使用NodeJS作为后端服务器 我通过Prisma管理数据 https www prisma io https www prisma io 我的客户要求对数据库
  • 识别标记并获取与其关联的对象的典型方法是什么?

    我在我的一个应用程序中使用地图 我想知道在点击标记时获取标记的关联对象的常见 有效方法是什么 我今天的计划是这样的 首先 我使用返回的标记创建对象的 ArrayList 和这些对象的 HashMapmMap addMarker 作为索引 A
  • 如何设置NSMenu/NSMenuItems的字体?

    我不知道如何在 NSMenu 中设置 NSMenuItems 的字体 样式 我在 NSMenu 上尝试了 setFont 方法 但它似乎对菜单项没有任何影响 NSMenuItem 似乎没有 setFont 方法 我希望它们都具有相同的字体
  • CSS 动画,单击时切换旋转

    我尝试让下面的插入符号在单击下拉菜单时旋转 180 度 在我尝试实现的解决方案中 它将插入符的类更改为单击时向上切换或向下切换 我第一次点击它时它会向上旋转 第二次它会立即返回到起始位置 然后再向上旋转 我闻到了脏代码的味道 添加此切换旋转
  • 在 ConstraintValidator 中注入服务 [Bean Validator - JSR 303] Spring

    下午好 我在 Bean Validator JSR 303 中注入服务时遇到问题 我将执行验证 但我需要验证数据库中的此记录 当我使用我的服务时 它抛出 NullPointerException 例外 Exception in thread
  • Ruby、RSVG 和 PNG 流

    我正在尝试在 Rails 应用程序中将图像从 SVG 转换为 PNG ImageMagick 不适合我 因为 Heroku 此时无法 想要升级 IM 我正在测试在开发中使用 RSVG2 Cairo 的一些想法 但遇到了障碍 我可以轻松地将
  • 将 ÆØÅ 等特殊字符读入 R (Rstudio)

    我正在尝试读取包含用挪威语编写的调查问卷数据的 CSV 文件 所以这个文件包含字母 但是 R 似乎不能很好地处理这些字母 它们都显示为问号 我用它来读取数据 data lt read csv2 Responser Vasket 20 06
  • 当我在 Visual Studio 2005 中保存文件时是否可以运行宏?

    当我在 Visual Studio 2005 中保存文件时 我希望还运行一个更新版权的宏 通过正则表达式搜索和替换 我对正则表达式并不陌生 但对 VB VBA 和 Visual Studio 宏很陌生 所以我具体需要帮助的是 让宏在保存时运
  • Java,具有同步方法的多线程

    有时我在让我的程序不陷入僵局时遇到一些麻烦 我想我需要添加第三个同步方法release 它可用于在调用ping后释放另一个线程 代码如下 Attempt at a simple handshake Girl pings Boy gets c
  • Angular - 模块没有导出成员“OpaqueToken”错误

    我应该如何解决这个错误 node modules ngrx store src ng2 d ts 1 10 中的错误 错误 TS2305 模块 C Users sandr Desktop wz r kopia node modules an
  • 开发了 strtok 替代品

    我开发了自己的 strtok 版本 只是为了练习指针的使用 任何人都可以看到这有任何限制 或者无论如何我可以改进 void stvstrtok const char source char dest const char token Sea