我有这个字符串:
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;
}
答案 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);
}