0

我有这个字符串:

字符串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 "17 - 19

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

请不要 Boost... 只有标准 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;
}
4

1 回答 1

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);
}
于 2013-02-17T04:40:20.910 回答