提问人:marian 提问时间:8/6/2023 最后编辑:273Kmarian 更新时间:8/6/2023 访问量:61
strtok 函数未在给定分隔符处拆分 [已关闭]
strtok function not splitting at the given delimiter [closed]
问:
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
答:
3赞
Vivick
8/6/2023
#1
std::strtok
将分隔字符列表作为其第二个参数。它不会按字符串/子字符串拆分。
如果你不反对使用 ,你可以按如下方式制作一个函数:std::string
tokUntil
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)指明了方向。
评论
std::strtok
"\n\n"
strstr()
strstr()
strtok()
strtok()
"\n"
\n
\n