2016-12-29 1 views
1

У меня есть задача конвертировать все вхождения некоторого слова в одну строку в другую строку. Но есть проблема с состоянием время цикла, что делает эту ошибкуstd :: out_of_range при использовании строки find и replace in while loop

Terminate вызывается после выбрасывания экземпляр «станд :: out_of_range»

, что(): basic_string :: заменить

Это приложение попросил Runtime прекратить его необычным способом. Для получения дополнительной информации обратитесь в службу поддержки приложения. Процесс возвращается 3 (0x3) время выполнения: 2.751 сек

Мой код:

#include <iostream> 
#include <string> 
using namespace std; 
int main() 
{ 
    string str2("three"); 
    string str("one three two four three three"); 
    while (str.find(str2) != NULL){ 
    str.replace(str.find(str2),str2.length(),"five"); 
    cout << str << endl; // i put it inside loop to see output 
    } 
    cout << str << endl; 
    return 0; 
} 

Любые предложения?

ответ

3

Вы проверяете, если str.find(str2) было возникновение, сравнивая его NULL, но это неправильно, потому что NULL макрос, который не предназначен для этого, и часто расширяется в 0, который может быть допустимым индексом. Вы должны сравнить его с std::string::npos. После выполнения этого изменения ваш код будет работать.

Редактировать: std::string::npos соответствует 18446744073709551615 при тестировании на coliru. Таким образом, это явно не является допустимым индексом в вашей строке.

+0

Спасибо за помощь. – DoktorD96

1

Это условие

while (str.find(str2) != NULL){ 

не имеет смысла, так как вызов find может вернуться std::string::npos, который не равен нулю. В этом случае код имеет неопределенное поведение.

Вы можете применить следующий подход

std::string str2("three"); 
std::string str("one three two four three three"); 

const char *five = "five"; 
size_t n = std::strlen(five); 

for (std::string::size_type pos = 0; 
    (pos = str.find(str2, pos)) != std::string::npos; pos += n) 
{ 
    str.replace(pos, str2.length(), five); 
} 
0

это вызвано тем, что str.find(str2) возвращается -1 если str2 не существовало в str. Вы можете использовать переменную pos, чтобы сохранить найденную позицию, так что вам не нужно будет повторно ссылаться на функцию find. Решение должно быть следующим:

#include <iostream> 
#include <string> 
using namespace std; 
int main() { 
    string str2("three"); 
    string str("one three two four three three"); 
    int pos = str.find(str2); 
    while (pos > 0) { 
    str.replace(pos, str2.length(), "five"); 
    pos = str.find(str2); 
    cout << str << endl; // i put it inside loop to see output 
    } 
    cout << str << endl; 
    return 0; 
}