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 - 111114 - 19 7"

つまり、数字を見つけて、数字の前後にスペースを挿入します。

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

あなたの解決策は実際には概念的にはかなり良いように見えますが、大きな問題が 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 に答える