Проблемы с использованием string :: find_first_not_of и string :: find_last_not_of - PullRequest
1 голос
/ 20 июля 2011

Я знаю, что эта проблема часто возникает, но я не смог найти кусок кода, который работал бы для меня.

Я пытаюсь удалить все знаки препинания из входящей строки, используя методы find_first_not_of и find_last_not_of в библиотеке строк:

//
//strip punctuation characters from string
//
void stripPunctuation(string &temp)
{
    string alpha = "abcdefghijklmnopqrstuvwxyz";

    size_t bFound = temp.find_first_not_of(alpha); 
    size_t eFound = temp.find_last_not_of(alpha);

    if(bFound != string::npos)
        temp.erase(temp.begin());
    if(eFound != string::npos)
        temp.erase(temp.end());
}

По сути, я хочу удалить что-нибудь в начале строки, которое не является алфавитным, и что-либо в конце строки, которое не является алфавитным. Когда эта функция вызывается, это приводит к ошибке сегментации. Я не уверен, куда мне следует проходить bFound и eFound?

1 Ответ

1 голос
/ 20 июля 2011

Никогда не пропустите .end ().Указывает на неверный итератор, который представляет конец.Если вы хотите удалить последний символ в строке, используйте temp.erase (temp.length () - 1).Если я вас правильно понимаю.

edit:

Кажется, что erase () принимает только итератор, что я и думал изначально.

Это не так:

string& erase ( size_t pos = 0, size_t n = npos );
iterator erase ( iterator position );
iterator erase ( iterator first, iterator last );

http://www.cplusplus.com/reference/string/string/erase/

...