strtok 函数未在给定分隔符处拆分 [已关闭]

strtok function not splitting at the given delimiter [closed]

提问人:marian 提问时间:8/6/2023 最后编辑:273Kmarian 更新时间:8/6/2023 访问量:61

问:


这个问题是由一个错别字或一个无法再重现的问题引起的。虽然类似的问题可能在这里成为主题,但这个问题的解决方式不太可能帮助未来的读者。

4个月前关闭。

Strtok 是这样称呼的:

char *headers = strtok(NULL, "\n\n");

在此字符串上:

"Host: 172.27.34.56\nConnection: keep-alive\nDNT: 1\nUpgrade-Insecure-Requests: 1\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/*;q=0.8,application/signed-exchange;v=b3;q=0.7\ncp-extension-installed: Yes\nAccept-Encoding: gzip, deflate\nAccept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7\nRange: bytes=85-85\nIf-Range: Wed, 19 Jul 2023 19:15:56 GMT\n\n123"

但它在第一个而不是 . 为什么?\n\n\n

C 字符串 strtok

评论

3赞 Drew Dormann 8/6/2023
这是设计使然。 将单个字符视为分隔符。第二个参数是“所有可以作为分隔符的不同字符”。std::strtok
2赞 Jonathan Leffler 8/6/2023
如果要拆分 ,请考虑使用 来查找它 — 或 C++ 等价物(因为是 C 函数,就像是 C 函数)。"\n\n"strstr()strstr()strtok()
0赞 Weather Vane 8/6/2023
您只需在传递给 的分隔符字符串中指定一个换行符。这足以过滤 的多个占用。第二个是多余的。strtok()"\n"\n\n

答:

3赞 Vivick 8/6/2023 #1

std::strtok将分隔字符列表作为其第二个参数。它不会按字符串/子字符串拆分。

参见 cppreference 上的例子

如果你不反对使用 ,你可以按如下方式制作一个函数:std::stringtokUntil

std::string tokUntil(std::string str, std::string delimiter) {
  auto pos = str.find(delimiter);
  return pos === std::string::npos ? str : str.substr(0, pos);
}
0赞 Fe2O3 8/6/2023 #2

如注释和其他答案中所述,搜索第二个参数中列出的字符的任何单个实例。strtok()

给定示例字符串,您似乎要隔离最后一个字段(在 double 之后)。'\n'

尝试:

    char *fldPtr = strrchr( headers, '\n' );
    if( fldPtr ) fldPtr += 1; // advance past that newline.

这将从字符串的末尾向开头进行搜寻。

根据源数据格式的一致性,您可能需要添加验证,以证明这提供了您期望的结果。例如:

    char *fldPtr = strrchr( headers, '\n' );
    if( fldPtr ) {
        if( fldPtr != headers && fldPtr[-1] == '\n' ) // got "\n\n" ???
            fldPtr += 1; // advance past that newline.
        else
            fldPtr = NULL;
    }

评论

0赞 Weather Vane 8/6/2023
仅当双换行符恰好是换行符的最后一次出现时。如果双换行符不是最后一次出现,则此答案将失败。
0赞 Fe2O3 8/6/2023
@WeatherVane 虽然你有一个观点,“给定示例字符串,你似乎想要......”谁能说OP的样本数据可能采取什么形式?我会加粗警告,让它脱颖而出......干杯!
2赞 Weather Vane 8/6/2023
确切地说:谁来说数据可能采取什么形式。乔纳森·莱夫勒(Jonathan Leffler)指明了方向。