colours
是std::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}}。
答案 0 :(得分:6)
string::replace
采用起始位置和长度,而不是起始位置和结束位置。 sizeof
也不返回字符串的长度。所以第三行应该是:
text.replace(i, iter->first.length(), iter->second);
对于它的价值,sizeof
返回对象消耗的堆栈空间量,这在编译时是已知的。所以它不能随着字符串的长度不同而不同。
答案 1 :(得分:1)
@luqui已经回答了为什么会出现段错误,但我想添加其他内容。
在替换字符串包含搜索字符串的情况下,请注意不要以无限循环结束。您可以通过string::find()
位置开始搜索来避免这种情况。这也可以提高效率,因为您当前的解决方案可以退化为O(N 2 )。