gpt4 book ai didi

c++ - 为什么 string.insert(iterator,char) 连续工作六次而不是七次? (C++)

转载 作者:太空狗 更新时间:2023-10-29 19:47:00 28 4
gpt4 key购买 nike

代码:

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

输出:

matt@Callandor:~/prog/tempVer$ g++ test.cpp -o play

matt@Callandor:~/prog/tempVer$ ./play

blah blah abcde blah blah

���blah blah defghi blah blah

* glibc detected * ./play: free(): invalid next size (fast): 0x08353068

======= Backtrace: ========= /lib/libc.so.6(+0x6c501)[0x5b5501]...

我在尝试使用 string::insert(iterator,char) 时遇到了一些奇怪的行为;我把它放在一个“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;

第一个完成得很好,第二个导致了段错误。

有人知道这里发生了什么吗?

最佳答案

在检查您的代码后,我注意到您使用的是无效的迭代器。

简而言之,插入字符串会使其迭代器无效。插入后,here 迭代器不再有效,因为除其他实现特定细节外,字符串容量可能会增加。当 here 迭代器在插入后再次使用时,这会导致未定义的行为,而没有先将其重置为修改后的字符串中的有效位置。

关于c++ - 为什么 string.insert(iterator,char) 连续工作六次而不是七次? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5012561/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com