实现分隔符具有多个字符的“strtok”

2023-12-04

代码片段:

char str[] = "String1::String2:String3:String4::String5";
char *deli = "::";
char *token = strtok(str,deli);

while(token != NULL)
{
  printf("Token= \"%s\"\n", token);
  token=strtok(NULL,deli);
}

上面的代码片段产生输出:

Token="String1"
Token="String2"
Token="String3"
Token="String4"
Token="String5"

但我希望输出是:

Token="String1"
Token="String2:String3:String4"
Token="String5"

我知道我没有得到预期的输出,因为每个字符在第二个参数中strtok被视为分隔符。

为了获得预期的输出,我编写了一个使用strstr(和其他东西)将给定的字符串拆分为标记,以便我获得预期的输出。这是程序:

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

int myStrtok(char* str,char* deli)
{
    if(str==NULL || deli==NULL)
        return -1;

    int tokens=0;
    char *token;
    char *output=str;


    while((token=strstr(output,deli))!=NULL)
    {

        bool print=true;

        if(output != token)
        {
            printf("Token = \"");
            tokens++;
            print=false;
        }

        while(output != token)
        {
            putchar(*output);
            output++;
        }

        if(print==false)
            printf("\"\n");
        output+=strlen(deli);
    }

    if(strlen(output)>0)
    {
        printf("Token = \"%s\"",output);
        tokens++;
    }
    printf("\n\n");
    return tokens;
}

int main(void)
{
    char str[]="One:1:Two::Three::::";
    char *deli="::";

    int retval;
    printf("Original string=\"%s\"\n\n",str);

    if((retval=myStrtok(str,deli))==-1)
        printf("The string or the delimeter is NULL\n");
    else
        printf("Number of tokens=%d\n", retval);
    return(EXIT_SUCCESS);
}

上述程序产生预期的输出。

我想知道是否有更简单/更简单的方法可以做到这一点。有吗?


使用的字符串分隔符函数strtok的原型并模仿其用法:

char *strtokm(char *str, const char *delim)
{
    static char *tok;
    static char *next;
    char *m;

    if (delim == NULL) return NULL;

    tok = (str) ? str : next;
    if (tok == NULL) return NULL;

    m = strstr(tok, delim);

    if (m) {
        next = m + strlen(delim);
        *m = '\0';
    } else {
        next = NULL;
    }

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

实现分隔符具有多个字符的“strtok” 的相关文章

随机推荐

  • 对空集/NA 的 NA 集求和而不是 0?

    The 求和函数如果应用于空集则返回 0 如果将其应用于一组 NA 值 是否有一种简单的方法可以使其返回 NA 这里有一个borrowed例子 test lt data frame name rep c A B C each 4 var1
  • 如何获取 ASP.NET MVC 中模型状态错误的集合?

    如何获取视图中的错误集合 我不想使用 Html Helper 验证摘要或验证消息 相反 我想检查错误以及是否有错误以特定格式显示它们 另外 在输入控件上 我想检查特定的属性错误并向输入添加一个类 附 我正在使用 Spark View Eng
  • Python速度测试-时差-毫秒

    在 Python 中比较 2 次以加速测试一段代码的正确方法是什么 我尝试阅读 API 文档 我不确定我是否理解 timedelta 的事情 到目前为止我有这个代码 from datetime import datetime tstart
  • .net XmlSerializer,忽略基类属性

    假设我们有一个从基类 System Windows Controls 派生的类 SerializedLabel XmlRoot SerializableLabel public class SerializableLabel Label p
  • 如何使用 getch() ncurses 获取 Ctrl、Shift 或 Alt?

    How to get Ctrl Shift or Alt with getch ncurses I cannot get it work to get Ctrl Shift or Alt with getch using ncurses D
  • Backbone.js 在 POST 请求上获取数据

    我是backbone js 的新手 我正在尝试使用我的服务发布数据 它会返回我的数据 我的服务是 http 192 168 1 3 8080 app search candidate它将输入作为 skills c java 它会将用户列表返
  • 黑客 DropDownList 值

    我有一个 DropDownList 我试图防止它被用作攻击媒介 我是否可以假设用户无法实际更改 DDL 的值并回发到服务器 目前 如果我尝试在提交后更改数据包 则会抛出以下 ASP NET 错误消息 For security purpose
  • 在c#中将点移动到另一个点

    我想将二维搜索空间中的某个点 a 移动到具有一定步长 config StepSize 0 03 的另一个点 b Point a agent Location Point b agentToMoveToward Location import
  • 如何从 HTML 中删除“不可见空间”[重复]

    这个问题在这里已经有答案了 可能的重复 内联块列表项之间的空格 我有一个JSFiddle 演示我的 html 代码 这是这里的代码 span style display inline Hello Wo span span style dis
  • 将 var 或 #' 应用于 Clojure 中的函数列表

    我正在尝试读取 Clojure 中函数集合的元数据 但 var 或 reader 特殊形式不起作用 除非它们直接处理符号 this works var my fn this doesn t defn val it x var x val i
  • Windows XP 嵌入式版本上出现 System.IO.IOException 的原因是什么?

    我正在 Windows XP 嵌入版本上运行 Net 3 5 应用程序 该应用程序通过串行 COM 端口写入和读取一些数据 该应用程序在我的笔记本电脑 Windows XP Professional 上运行良好 但在嵌入式 Windows
  • 您可以将带有参数的函数存储在列表中并稍后在 Python 中调用它们吗?

    例如 当我有 def function text print text mylist function yes function no mylist 0 它只是打印 yes 和 no 并且不执行任何操作mylist 0 我希望它能够使用列表
  • 比较 MySQL 中的二进制值

    假设你有两个二进制值 001011 001111 MySQL中如何获取不同位数 我试过 SELECT BIT COUNT BINARY 001011 BINARY 001111 这将返回 6 而我需要一个在此示例中返回 1 的解决方案 SE
  • 如何在react-native中激活GPS图标?

    我希望当我打开包含地图的应用程序或屏幕时在状态栏上显示 GPS 图标 因此我添加了一个功能 在第一次时要求用户允许位置权限 并且它工作得很好 我可以获得纬度 经度 但是GPS 位置 图标未激活 如何强制应用程序激活此图标 这是我的请求许可功
  • 克服跨域问题

    是否有任何方法可以克服在违反同源策略的情况下尝试从另一个 Web 服务器检索客户端数据时出现的跨域问题 http en wikipedia org wiki JSONP http api jquery com jQuery getJSON
  • 通过c#编辑内存地址

    我想编辑一个活动的应用程序 编辑内存地址 在地址上00498D45我想编辑它的值 当前值 MOV BYTE PTR SS EBP 423 7 to 更新值 MOV BYTE PTR SS EBP 423 8 到目前为止我得到的是这个 在网上
  • 在本地主机上运行 vue-cli 欢迎页面的 Docker 容器:无法访问此站点

    Question 我想在 Chrome 中看到 vue cli 欢迎页面 它从我的 Mac 上的 Docker 容器运行 我正在努力设置正确的配置以使其发挥作用 我缺少什么 这是我尝试过的 Steps 已安装 适用于 Mac 的 Docke
  • 如何设置轮胎弹性搜索的默认分析器?

    我最近一直在用 ruby on Rails 尝试 Elasticsearch 我在对数据进行索引时遇到问题 因此我可以使用复数和非复数关键字搜索项目 Tire 将允许我为每个映射属性分配一个分析器 mapping do indexes ti
  • 在 Android 中通过自定义键盘在 EditText 上设置撰写文本

    解释我正在尝试做什么 我正在制作一个自定义的应用程序内键盘 其工作原理与这个例子 但是 在我的键盘中 我使用弹出窗口来显示额外的字母形式 在传统蒙古语字母有不同的形式 具体取决于它们是否位于单词的开头 中间或结尾 通常这些可以根据上下文确定
  • 实现分隔符具有多个字符的“strtok”

    代码片段 char str String1 String2 String3 String4 String5 char deli char token strtok str deli while token NULL printf Token