【问题标题】:Splitting a string based on multiple string separators in c++在c ++中基于多个字符串分隔符拆分字符串
【发布时间】: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?
  • 当然,抱歉。已添加。

标签: c++ string c++98


【解决方案1】:

想通了:

    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 (1)
        {
        okpos = string_to_split.find(okseparator);
        kopos = string_to_split.find(koseparator);
        if (okpos < kopos)
        {
            mysubstring[index] = string_to_split.substr(0, okpos + okseparator.length());
            string_to_split.erase(0, okpos + okseparator.length());
            index++;
        }
        else if (okpos > kopos)
        {
            mysubstring[index] = string_to_split.substr(0, kopos);
            string_to_split.erase(0, kopos + koseparator.length());
            index++;
        }
        else
        {
            break;
        }
        }
}

我得到了两个分隔符的位置,但我只考虑最接近的一个。 当两个分隔符的位置相同(string::npos = max(size_t))时,while(1) 终止。

【讨论】:

    猜你喜欢
    • 2011-11-28
    • 2012-02-27
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多