ispunct () не удаляет запятые в середине строки - PullRequest
0 голосов
/ 18 октября 2011

У меня есть строка, состоящая из:

UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity.

У меня есть следующий код, который должен убрать эту строку из всех знаков препинания. Тестовая переменная - это моя строка:

 if(std::ispunct(test[test.length()-1]))
    {
        test.erase(test.length()-1, 1);
    }

Однако, когда я снова вывожу эту строку после этой функции, у меня будет следующее:

UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity

По какой-то причине функция ispunct может удалять период, но не запятую. Почему так себя ведет? Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 18 октября 2011

Похоже, вы ищете алгоритм remove_if (вместе с предикатом ispunct ).

NB:

За вызовом remove обычно следует вызов метода erase контейнера, который стирает неопределенные значения и уменьшает физический размер контейнера, соответствующий его новому логическому размеру.

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

int main()
{
    std::string dmr = "UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity.";
    auto last = std::remove_if(dmr.begin(), dmr.end(), ispunct);
    dmr.erase(last, dmr.end());
    std::cout << dmr << std::endl;
}

Смотрите, как он работает!

3 голосов
/ 18 октября 2011

Ну, вы делаете это только для test[test.length()-1] (последний символ в строке).Там нет запятой, только точка.

...