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

Not*_*ggs 0 c++ string segmentation-fault

coloursstd::map<string, string>每对的第一个元素是2个字母的std::string颜色代码,第二个元素是该std::string颜色的7个字符的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

luq*_*qui 6

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

text.replace(i, iter->first.length(), iter->second);
Run Code Online (Sandbox Code Playgroud)

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