为什么这个字符串搜索并替换段错误?

时间:2011-01-01 21:15:27

标签: c++ string segmentation-fault

coloursstd::map<string, string>,其中每对的第一个元素是2个字母std::string颜色代码,第二个元素是7个字符std::string shell转义码对于那种颜色。

size_t i;
for(map<string, string>::iterator iter = colours.begin(); iter != colours.end(); iter++) {
    while((i = text.find(iter->first)) != string::npos) {
        text.replace(i, i + sizeof(iter->first), iter->second);
    }
}

运行此代码时,程序会出现段错误。我最好的猜测是,它与替换字符串的长度超过它所替换的字符串的长度有关,但据我所知,这只能导致char *的段错误,而不是{{ 1}}。

2 个答案:

答案 0 :(得分:6)

string::replace采用起始位置和长度,而不是起始位置和结束位置。 sizeof也不返回字符串的长度。所以第三行应该是:

text.replace(i, iter->first.length(), iter->second);

对于它的价值,sizeof返回对象消耗的堆栈空间量,这在编译时是已知的。所以它不能随着字符串的长度不同而不同。

答案 1 :(得分:1)

@luqui已经回答了为什么会出现段错误,但我想添加其他内容。

在替换字符串包含搜索字符串的情况下,请注意不要以无限循环结束。您可以通过string::find()位置开始搜索来避免这种情况。这也可以提高效率,因为您当前的解决方案可以退化为O(N 2 )。