что не так в этом коде? - PullRequest
1 голос
/ 06 октября 2010

у меня следующий код

#include <iostream>
#include <string>
using namespace std;
string replace(string s){

    for (int i=0;i<s.length();i++){
        if (s[i]> 'b' &&  s[i]<'f'){
            s.erase(s[i]);

        }

    }
    return  s;
}
int main(){

    string s;
    cin>>s;
    cout<<replace(s)<<endl;


    return 0;

}

если я въезжу в Грузию, это покажет мне исключение "abort назвали" почему?

1 Ответ

6 голосов
/ 06 октября 2010

std::string::erase() принимает либо индексную пару, либо итераторы.

Посмотрите на эту ссылку .

Здесь s[i] дает символ, который по ошибке преобразуетсядо size_t, поэтому, в зависимости от вашей строки, вы в основном пытаетесь удалить элемент, который не существует.

Более чистое решение:

#include <string>
#include <iostream>
#include <cstdlib>

bool should_be_removed(char c) { return (c > 'b') && (c < 'f'); }

int main()
{
  std::string s;
  std::cin >> s;
  s.erase(std::remove_if(s.begin(), s.end(), should_be_removed), s.end());

  return EXIT_SUCCESS;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...