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

std::string search for numbers in a string & insert space before & after

本文关键字:插入 空格 搜索 string 字符串 std 数字      更新时间:2023-10-16

我有这个字符串:

string strInput="33kfkdsfhk33 324234k334k 333 3 323434/5545435436***33/rrrr34 e3mdgmflkgfdlglk3434424dfffff555555555gggggg00000033lll-111111 1974-1-12";

我想把它格式化为:

"33 kfkdsfhk 33 324234 k 334 k 333 3 323434/5545435436*33/rrrr 34 e 3 mdgmflkgfdlglk 3434424 dfffff 555555555 gggggg 00000033lll-111111 1974-1-12";

也就是说,找到一个数字,并在数字前后插入空格。

请不要助推。。。只有标准的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;
}

您的解决方案实际上在概念上看起来相当不错,但有一个主要问题:将insert转换为字符串后,所有指向它的迭代器都可能无效,尤其是循环迭代器it。这可能会导致segfault和各种难以解释的错误。

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

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);
}