代码:为什么string.insert(iterator,char)连续工作六次而不是七次? (C++)
#include <iostream>
#include <string>
using namespace std;
string expand(string mask);
int main()
{
string tiny = "blah blah [a-e] blah blah";
string lengthy = "blah blah [a-i] blah blah";
cout << expand(tiny) << endl;
cout << expand(lengthy) << endl;
return 0;
}
string expand(string mask)
{
int i, range;
/* find the first bracket, grab start letter */
unsigned int bracket = mask.find("[");
char start = mask[bracket + 1];
/* point iterator at first bracket */
string::iterator here = mask.begin();
here += bracket;
/* find second bracket, calculate ascii range */
range = mask[bracket + 3] - mask[bracket + 1];
/* kill brackets and their contents*/
mask.erase(here, here + 5);
/*** This loop causes an error on the 7th iteration ****/
for(i = 0; i <= range; i++)
mask.insert(here, (start + range) - i);
return mask;
}
输出:
亚光@ Callandor:〜/ PROG/TEMPVER $克++ TEST.CPP -o玩
亚光@ Callandor:〜/ prog/tempVer $ ./play
blah blah abcde blah blah
等等等等defghi等等等等
* glibc的检测* ./play:免费():无效的下一个尺寸(快速):0x08353068
=======回溯:========= /lib/libc.so.6(+0x6c501)[0x5b5501] ...
我尝试使用string :: insert()时遇到一些奇怪的行为迭代器,炭);我把它放在'for'循环中,我根本不移动迭代器,循环只是插入字符。如果我有六个或更少的字符插入,但它失败了七个或更多,它工作正常。
基于输出(见上面),它看起来像在六次插入之后迭代器跳转到字符串的开始并开始插入垃圾。当程序结束时,我得到了一个大杂乱的错误。
虽然试图原因隔离我试图两个环路(均未触摸迭代):
for(i = 0; i < 6; i++)
mask.insert(here, (start + range) - i);
cout << mask << endl;
for(i = 0; i < 7; i++)
mask.insert(here, (start + range) - i);
cout << mask << endl;
第一完成得很好,第二引起分段故障。
有人知道这里发生了什么吗?
你最后一个例子的缩进很容易让人误解。 – 2011-02-16 05:12:16