C ++ Удалить пунктуацию из строки

У меня есть строка, и я хочу удалить из нее все помехи. Как я могу это сделать? Я провел некоторое исследование и обнаружил, что люди используют функцию ispunct () (я пробовал это), но я не могу заставить ее работать в моем коде. У кого-нибудь есть идеи?

#include  int main() { string text = "this. is my string. it's here." if (ispunct(text)) text.erase(); return 0; } 

    Используя алгоритм remove_copy_if : –

     string text,result; std::remove_copy_if(text.begin(), text.end(), std::back_inserter(result), //Store output std::ptr_fun(&std::ispunct) ); 

    POW уже имеет хороший ответ, если вам нужен результат в виде новой строки. Этот ответ заключается в том, как обращаться с ним, если вы хотите обновить на месте.

    Первая часть рецепта – std::remove_if , которая может эффективно удалять пунктуацию, упаковывая всю не-пунктуацию по мере ее появления.

     std::remove_if (text.begin (), text.end (), ispunct) 

    К сожалению, std::remove_if не сжимает строку до нового размера. Это невозможно, потому что у него нет доступа к самому контейнеру. Поэтому в результате после упакованного результата есть символы нежелательной почты в строке.

    Чтобы справиться с этим, std::remove_if возвращает iterator, который указывает ту часть строки, которая по-прежнему необходима. Это можно использовать с методом erase строк, что приводит к следующему идиому …

     text.erase (std::remove_if (text.begin (), text.end (), ispunct), text.end ()); 

    Я называю это идиомой, потому что это обычная техника, которая работает во многих ситуациях. Другие типы, кроме string предоставляют подходящие методы erase и std::remove (и, возможно, некоторые другие функции библиотеки алгоритмов, которые я забыл на данный момент) используют этот подход для закрытия пробелов для элементов, которые они удаляют, но оставляя размер контейнера вызывающий абонент.

     #include  #include  #include  int main() { std::string text = "this. is my string. it's here."; for (int i = 0, len = text.size(); i < len; i++) { if (ispunct(text[i])) { text.erase(i--, 1); len = text.size(); } } std::cout << text; return 0; } 

    Выход

     this is my string its here 

    При удалении символа изменяется размер строки. Он должен обновляться при каждом удалении. И вы удалили текущий символ, поэтому следующий символ станет текущим символом. Если вы не уменьшите счетчик циклов, символ рядом с символом пунктуации не будет проверен.

    ispunct принимает значение char не строку.

    вы можете сделать

     for (auto c : string) if (ispunct(c)) text.erase(text.find_first_of(c)); 

    Это будет работать, но это медленный алгоритм.

    Проблема здесь в том, что ispunct () принимает один аргумент как символ, в то время как вы пытаетесь отправить строку. Вы должны перебирать элементы строки и стирать каждый символ, если это пунктуация, как здесь:

     for(size_t i = 0; i 
     #include  #include  #include  using namespace std; int main() { string str = "this. is my string. it's here."; transform(str.begin(), str.end(), str.begin(), [](char ch) { if( ispunct(ch) ) return '\0'; return ch; }); } 

    Другой способ, которым вы могли бы это сделать, состоял в следующем:

     #include  //needed for ispunct() string onlyLetters(string str){ string retStr = ""; for(int i = 0; i < str.length(); i++){ if(!ispunct(str[i])){ retStr += str[i]; } } return retStr; 

    Это приводит к созданию новой строки вместо фактического стирания символов из старой строки, но немного легче обернуть голову, чем использовать некоторые из более сложных встроенных функций.

      #include  #include  using namespace std; int main() { string s;//string is defined here. cout << "Please enter a string with punctuation's: " << endl;//Asking for users input getline(cin, s);//reads in a single string one line at a time /* ERROR Check: The loop didn't run at first because a semi-colon was placed at the end of the statement. Remember not to add it for loops. */ for(auto &c : s) //loop checks every character { if (ispunct(c)) //to see if its a punctuation { c=' '; //if so it replaces it with a blank space.(delete) } } cout << s << endl; system("pause"); return 0; } 

    Попытайтесь использовать этот, он удалит всю пунктуацию в строке в текстовом файле oky. str.erase (remove_if (str.begin (), str.end (), :: ispunct), str.end ());

    ответьте, если будете полезны

    я понял.

     size_t found = text.find('.'); text.erase(found, 1);