【发布时间】:2018-06-12 18:38:42
【问题描述】:
我只使用标准库在 C++98 中编写我的代码。 我正在尝试编写一些代码将字符串拆分为多个子字符串,每个子字符串由字符串“OK”或字符串“ERROR”分隔。 每个子字符串都应该放在 mysubstring 数组中。
这是我为单个分隔符编写的代码:
void split_string()
{
for (unsigned short k=0;k<10;k++)
{
mysubstring[k]=""; //resetting all substrings
}
string separator = "OK";
size_t pos = 0;
unsigned short index=0;
while ((pos = str_to_split.find(separator)) != std::string::npos) {
mysubstring[index] = str_to_split.substr(0, pos);
str_to_split.erase(0, pos + separator.length());
index++;
}
这个单分隔符版本可以正常工作。 然后我尝试升级到两个分隔符:
void split_string()
{
for (unsigned short k=0;k<10;k++)
{
mysubstring[k]=""; //resetting all substrings
}
string okseparator = "OK";
string koseparator = "ERROR";
size_t okpos = 0;
size_t kopos = 0;
unsigned short index=0;
while ((okpos = string_to_split.find(okseparator)) != std::string::npos)
{
while ((kopos = string_to_split.find(koseparator)) != std::string::npos)
{
if (okpos <= kopos)
{
mysubtring[index] = string_to_split.substr(0, okpos + okseparator.length());
string_to_split.erase(0, okpos + okseparator.length());
index++;
}
else
{
mysubstring[index] = string_to_split.substr(0, kopos + koseparator.length());
string_to_split.erase(0, kopos + koseparator.length());
index++;
}
}
}
while ((kopos = string_to_split.find(koseparator)) != std::string::npos)
{
mysubtring[index] = string_to_split.substr(0, kopos + koseparator.length());
string_to_split.erase(0, kopos + koseparator.length());
index++;
}
}
这里的想法是我停留在第一个 while 循环中,直到所有“OK”都被消耗完,然后它进入最后一个 while 以完成剩下的所有“ERROR”。 子字符串应该按照它们在 string_to_split 原始字符串中的相同顺序进入 mysubstring 数组。
很遗憾我不能让它工作,你能帮帮我吗?
测试验证示例:
#include <iostream>
#include <string.h>
void split_string();
string str_to_split = "skdjfnsdjknfjk OK fkjsnfjksdnfjnsdjkfn ERROR skjdfnjksdnf OK sjkdnfjksdnfjERROR jnfjnsdjfnsjdknfjkn OK";
use namespace std;
int main()
{
split_string();
return 0;
}
【问题讨论】:
-
为什么这不起作用?你到底想让它做什么,你看到的实际结果是什么?
-
我看到了一个无限循环,我猜想当 okpos = kopos 特别是当 okpos = max(size_t) = kopos 时。当 string::find == npos 时会发生这种情况
-
发布一个minimal reproducible example 怎么样,我们可以实际测试,而不仅仅是编码sn-ps?
-
当然,抱歉。已添加。