Код упрощен по сравнению с более сложной программой, но проблема, с которой я сталкиваюсь, все еще возникает в этой более упрощенной ситуации.
Итак, я пытаюсь стереть символ из строки с помощью указателя:
string str = "Hellxo World";
char *eraseHere;
for(int i = 0; i < str.length(); i++) {
if (str[i] == 'x') {
eraseHere = &str[i];
str.erase(*eraseHere);
}
}
Я ожидал, что str станет Hello World, но вместо этого выдает исключение out_of_range и останавливает программу.
Разве eraseHere не является указателем на символ «x»? Я использовал eraseHere в printf, чтобы проверить, что не так:
printf("%c\n",*eraseHere);
Но он мог отлично напечатать этот символ.
Заранее спасибо.





Класс string не поддерживает стирание с помощью указателя, поэтому вы не можете этого сделать.
Вы можете стереть с помощью итератор, что почти то же самое
for (auto i = str.begin(); i != str.end(); ) {
if (*i == 'x')
i = str.erase(i);
else
++i;
}
Кроме того, даже если это сработало, в вашем коде есть распространенная ошибка новичков, которую вы игнорируете: ваша строка становится короче, когда вы стираете символ. Так что делать i++ после стирания символа неправильно, потому что вы пропустите символ после только что удаленного 'x'.
Прежде всего, спасибо за ответ. Что мне делать, если я хочу «сохранить» позицию для стирания символа? Потому что я хочу стереть символ только до тех пор, пока не будет выполнено другое условие (например, пока в строке не появится "#").
Вы можете сохранить итератор в переменной и использовать его позже. string::iterator iter = .... Вы можете сохранить смещение и создать итератор позже int off = ...; , а затем str.erase(str.begin() + off);. Добавив off в str.begin(), вы получите итератор, соответствующий смещению.
На самом деле, если у вас есть смещение, вы можете просто использовать его напрямую, str.erase(off, 1); стирает один символ, начиная с off.
вы можете просто сохранить индекс 'x', а затем удалить его после завершения цикла ... или вы можете использовать итератор в ответе выше
string str = "Hellxo World";
char *eraseHere;
int indx=-1;
for(int i = 0; i < str.length(); i++)
{
if (str[i] == 'x')
{
eraseHere = &str[i];
indx=i;
}
}
indx!=-1 ? (str.erase(indx,1)):str;
cout<<str<<endl;
std::string::eraseможет быть полезным. Вы передаете либо итератор, либо показатель. И'x'на самом деле не является допустимым индексом, если у вас нет строки, превышающей длину символов120(при условии кодировки ASCII).