【问题标题】:How can i use 2 strtok in c?我如何在 c 中使用 2 strtok?
【发布时间】:2023-04-05 12:44:01
【问题描述】:

我在 c 中工作,我在这方面有点新。 我有这个字符串:

7EB3A50110140F3955025607EB7A50110140F3957730188

数据包从“7E”开始,所以我使用 strtok(string,"E") 将这两个数据包分开

B3A50110140F3955025607
B7A50110140F39577301887

现在我想消除每个标记的 A、B、F,所以我想出了这个想法:

while(token!=NULL)
    {
        cout<<"addrT:"<<&token<<" value: "<<token<<"\n";
        token=strtok(NULL,"E");
        char *token1=strtok(token,"ABCDEF");
        while(token1!=NULL){
            token=strtok(NULL,"ABCDEF");
        }
        cout<<"addrT1:"<<&token<<" value: "<<token<<"\n";

    }

它根本不起作用,所以我想用这段代码检查每个令牌的地址:

     token=strtok(string,"E");
    while(token!=NULL)
        {
            cout<<"addrT:"<<&token<<" value: "<<token<<"\n";
            token=strtok(NULL,"E");
            char *token1=strtok(token,"ABCDEF");
            cout<<"addrT1:"<<&token<<" value: "<<token<<"\n";

        }

我发现第二个令牌使用与我的第一个令牌相同的内存地址,那么我应该怎么做才能获得具有值的新令牌?

提前致谢

【问题讨论】:

  • 如果你的数据中间有“E”怎么办?
  • “7E”就像是数据包的开始,所以我现在唯一的想法就是使用“E”。我接受任何建议!
  • 如果数据包中间有一个“E”,例如“E5”、“1E”等,你所做的就行不通了。大概每一对字符代表一个字节,因此请成对使用字符。
  • 为什么不遍历字符串来搜索“E7”,而不仅仅是“E”?
  • strtok() 依靠静态变量来跟踪字符串中的当前解析位置。此实现需要在开始第二个字符串之前完全解析一个字符串。如果您的编译器支持它,请使用strsep(),但您的代码将不可移植。您可以根据需要编写自己的实现来解析给定的字符串并将其拆分为标记。

标签: c++ string.h


【解决方案1】:

如果您的库支持它(即定义__STDC_LIB_EXT1__),您可以使用strtok_s。请注意,您必须在包含 &lt;string.h&gt; 之前将 __STDC_WANT_LIB_EXT1__ 定义为 1,因为 strtok_s 是标准的可选扩展。

如果您正在为 POSIX 目标编码,您可以使用 strtok_r

请注意,我没有检查您的示例代码是否有错误; cmets 表明除了需要两个独立的strtok 调用之外,您可能还有其他问题。

【讨论】:

    【解决方案2】:

    也许你实际上得到了一个不同的令牌。您将从第一个 strtok 调用返回的指针存储在 token 中,从第二个调用返回的指针存储在 token1 中,但是您的两个输出语句都输出了 token,并且都没有输出 token1。这就是为什么值是相同的。

    【讨论】:

    • 确实是错误,现在我对如何处理这个有了更好的想法。谢谢你们!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 2013-09-26
    相关资源
    最近更新 更多