Удаление персонажа из строки - PullRequest
5 голосов
/ 27 декабря 2010

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

str.erase(remove_if(str.begin(), str.end(), isspace), str.end());

но мой компилятор g ++ выдает ошибку:

error: no matching function for call to ‘remove_if(__gnu_cxx::__normal_iterator<char*,
std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>,
std::allocator<char> > >, <unresolved overloaded function type>)’

, пожалуйста, помогите.

Ответы [ 4 ]

7 голосов
/ 03 января 2011

Первая проблема заключается в том, что isspace имеет несколько перегрузок в стандартной библиотеке C ++. Первоначальное исправление заключается в предоставлении явного типа для функции, чтобы компилятор знал, для какой функции взять адрес:

#include <string>
#include <algorithm>
#include <cctype>

int main()
{
   std::string str = "lol hi innit";
   str.erase(std::remove_if(str.begin(), str.end(), (int(*)(int))isspace), str.end());
   std::cout << str; // will output: "lolhiinnit"
}

Это ужасно, но, эй, это C ++.

Во-вторых, ваш код удалит все пробелы в строке, а это не то, что вам, кажется, нужно. Рассмотрим простое выражение if для последнего символа строки:

#include <string>
#include <cassert>

int main()
{
   std::string str = "lol hi innit ";
   assert(!str.empty());

   if (*str.rbegin() == ' ')
      str.resize(str.length()-1);

   std::cout << "[" << str << "]"; // will output: "[lol hi innit]"
}

Надеюсь, это поможет.

6 голосов
/ 27 декабря 2010

Я думаю, что он не может понять, что такое isspace (в соответствии с "неразрешенным типом перегруженной функции" в качестве третьего параметра для remove_if в сообщении об ошибке).Попробуйте ::isspace и включите ctype.h

0 голосов
/ 03 марта 2013

У меня была точно такая же проблема, как и у вас, поэтому я избавился от isspace. Я просто пошел с этим:

str.erase(std::remove_if(str.begin(),str.end(),' '),str.end());

Это сработало для меня с Visual C ++ 2012, с использованием Visual Studio 2012. Посмотрите, работает ли оно у вас.

0 голосов
/ 27 декабря 2010

Вам не хватает std:: для remove_if

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