【问题标题】:How to strtok() string using the null character as the delimiter? [closed]如何使用空字符作为分隔符来 strtok() 字符串? [关闭]
【发布时间】:2016-04-28 11:17:36
【问题描述】:

我尝试将空字符输入到分隔符列表中,但它不接受它。我尝试输入“\0”,但它不接受它。我什至尝试在双引号中加上转义字符,但它仍然不接受。

有没有办法可以做到这一点?

【问题讨论】:

  • 如何区分'\0' 分隔符和空终止符?
  • 你知道你的字符串的长度吗?
  • 您必须提前知道字符串的长度,或者有一个替代的结束标记。没有其他方法可以让它发挥作用。
  • strchr(string, '\0'); 有效。我已经告诉过你很多次了,不要使用strtok()
  • 您的字符串不包含任何空字符,那么尝试将其拆分为空字符有什么意义?

标签: c parsing strtok


【解决方案1】:

如果允许您使用双 \0 作为标记来结束您的字符串,您可以构建自己的函数,例如:

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

int main(void)
{
    char *s = "abc\0def\0ghi\0";
    char *p = s;

    while (*p) {
        puts(p);
        p = strchr(p, '\0');
        p++;
    }
    return 0;
}

输出:

abc
def
ghi

【讨论】:

  • p = strchr(p, '\0'); 或只是p += strlen(p); 以避免p++
  • @milevyo: 实际上是p += strlen(p) + 1; 避免p++
  • @chqrlie,当然谢谢
【解决方案2】:

根据strtok(3),此函数用于隔离空终止字符串中的顺序标记。所以答案是否定的,不使用 strtok,因为该函数无法比较终止符中的 \0 分隔符。您将不得不编写自己的函数(这很简单)。

还请阅读strtok man page 中的错误部分...最好避免使用它。

【讨论】:

    【解决方案3】:

    在 C 中,字符串只是必须以空字符结尾的字符数组。如果内存中的字符串没有以这种方式终止,程序将无休止地读取内存,直到找到一个空字符,并且由于内存不断变化,因此无法确定它将在哪里。您最好的选择是创建一个 char 指针(字符串)数组并使用更好的组织来填充它们。

    【讨论】:

      【解决方案4】:

      无论好坏,C 决定所有字符串都以 null 结尾,因此您不能基于该字符进行解析。

      一种解决方法是将(非字符串)二进制缓冲区中的所有空值替换为您知道缓冲区中不会出现的内容,然后将其用作分隔符,将缓冲区视为 char*。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 2016-08-05
        • 1970-01-01
        • 2018-05-02
        • 2019-12-10
        • 1970-01-01
        相关资源
        最近更新 更多