Почему эта строка ищет и заменяет segfault? - PullRequest
0 голосов
/ 02 января 2011

colours - это std::map<string, string>, где первый элемент каждой пары представляет собой двухбуквенный std::string код цвета, а второй элемент представляет собой 7-символьный std::string код перехода оболочки для этого цвета.

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

Когда этот код запущен, программа segfaults. Мое лучшее предположение заключается в том, что это связано с тем, что длина замещающей строки больше, чем длина заменяемой строки, но, насколько мне известно, это может вызывать сегрегирование только с char *, а не std::string.

Ответы [ 2 ]

6 голосов
/ 02 января 2011

string::replace принимает начальную позицию и длину, а не начальную позицию и конечную позицию. Также sizeof не возвращает длину строки. Поэтому третья строка, вероятно, должна выглядеть так:

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

Для чего стоит, sizeof возвращает количество стека пространства, используемого объектом, которое известно во время компиляции Таким образом, он не может варьироваться от вызова к вызову, что зависит от длины строки.

1 голос
/ 02 января 2011

@ luqui уже ответила, почему он segfaults, но я хотел добавить еще кое-что.

Будьте осторожны, чтобы не оказаться в бесконечном цикле, если ваша замещающая строка содержит строку поиска. Вы можете избежать этого, передав string::find() позицию для начала поиска. Это также повысит эффективность, так как текущее решение может выродиться до O (N 2 ).

...