std :: string搜索字符串中的数字&在&之前插入空格后

时间:2013-02-17 04:08:20

标签: c++ string

我有这个字符串:

  

string strInput =“33kfkdsfhk33 324234k334k 333 3 323434/545435436 *** 33 / rrrr34 e3mdgmflkgfdlglk3434424dfffff555555555555gggggg00000033lll-111111 1974-1-12”;

我想将其格式化为:

  

“33 kfkdsfhk 33 324234 k 334 k 333 3 323434/545435436 * 33 / rrrr 34 e 3 mdgmflkgfdlglk 3434424 dfffff 555555555555 gggggg 00000033lll - 111111 1974 - 1 - 12”;

即找到一个数字并在数字前后插入空格。

No Boost please ...只有标准的C ++库。

这是我试过的,在数字后插入空格,我想将所有连续数字分组以获得所需的输出。

strInput = "33kfkdsfhk33  324234k334k     333 3   323434/545435436***33/rrrr34       e3mdgmflkgfdlglk3434424dfffff555555555555gggggg00000033lll-111111 1974-1-12";
for ( std::string::iterator it=strInput.begin(); it!=strInput.end(); ++it)
{
    static bool flag = false;
    if(isdigit(*it) && !flag)
    {
        strInput.insert(it,1,' ');
        flag = true;
    }
    else
        flag = false;
}

1 个答案:

答案 0 :(得分:1)

你的解决方案在概念上看起来确实相当不错,但是有一个主要问题:在insert进入字符串后,指向它的所有迭代器都可能无效,特别是你的循环迭代器it。这可能导致段错误和各种难以解释的错误。

作为一种替代解决方案,我建议不要修改你开始使用的字符串,而只是从中读取并逐步构建一个新的字符串,在你想要的地方插入空格。这实际上只是对您当前代码的一个小修改!

string strInput = ... // whatever;
string newString = "";
bool currentisdigit = false;
bool previouswasdigit = false;
for ( std::string::iterator it=strInput.begin(); it!=strInput.end(); ++it)
{
    previouswasdigit = currentisdigit;
    currentisdigit = isdigit(*it);
    if(currentisdigit && !previouswasdigit)
        newString.push_back(' ');
    if(!currentisdigit && previouswasdigit)
        newString.push_back(' ');
    newString.push_back(*it);
}