gpt4 book ai didi

c++ - 使用 C++ 进行 strtok 拆分时出错

转载 作者:太空宇宙 更新时间:2023-11-04 16:18:45 25 4
gpt4 key购买 nike

我必须使用 C++ 使用 strok 函数拆分示例字符串。示例字符串是:"This|is||a||sample||string|",同时通常使用 strok 拆分它。

#include <stdio.h>
#include <string>
#include <string.h>
using namespace std;

int main()
{
string str="This||a||sample||string|";

string a;

str=strtok ((char *)str.c_str(),"|");

while (str.c_str() != NULL)
{
printf ("str:%s\n",str.c_str());

str = strtok (NULL, "|");

}

return 0;
}

结果:

str:This

str:a
str:sample

str:string

将相同的字符串更改为 "This| |a| |sample| |string|" 会得到预期的结果:

str:This

str:

str:a

str:

str:sample

str:

str:string

如何在不更改字符串的情况下获得预期结果?

最佳答案

std::string 上使用 std::strtok 将产生未定义的行为,因为 std::strtok是破坏性的(提示:std::string::c_str() 返回 const char*)。

相反,多次使用 std::string::findstd::string::substr:

#include <iostream>
#include <string>
#include <iterator>

template <class OutputIt>
OutputIt safe_tokenizer(const std::string & s, char token, OutputIt out){
std::string::size_type pos = 0, f;
while((f = s.find(token, pos)) != std::string::npos){
*out++ = s.substr(pos, f - pos);
pos = f + 1;
}
if(pos < s.size())
*out++ = s.substr(pos);
return out;
}

int main(){
const std::string str = "Hello|World|How|Are|You";
safe_tokenizer(str, '|', std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}

关于c++ - 使用 C++ 进行 strtok 拆分时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19605720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com