Например, у меня пользователь вводит номер телефона.
cout << "Enter phone number: ";
INPUT: (555) 555-5555
cin >> phone;
Я хочу удалить из строки символы «(», «)» и «-». Я просмотрел функции удаления, поиска и замены строки, но я вижу только, что они работают в зависимости от положения.
Есть ли строковая функция, которую я могу использовать для передачи символа, например "(", и удалить все экземпляры в строке?
std::remove
перемещает неудаленные элементы в начало вектора и возвращает итератор, указывающий сразу за последним неудаленным элементом. Затемstd::erase
обрезает вектор от этого итератора до конца.string chars("()-");
а затем использовать.length()
метод, чтобы получить длину и.at(i)
метод для доступа к символам :) Функционализированная скрипка - ideone.com/tAZt5I<iostream>
<algorithm>
<cstring>
Вы можете использовать
std::remove_if()
алгоритм для удаления только указанных вами символов:В
std::remove_if()
Алгоритм требует то , что называется предикатом, который может быть указателем на функцию , как фрагмент кода выше.Вы также можете передать объект функции (объект, который перегружает
()
оператор вызова функции ). Это позволяет нам создать еще более общее решение:Вы можете указать, какие символы нужно удалить из
"()- "
строки. В приведенном выше примере я добавил пробел, чтобы удалить пробелы, а также скобки и тире.источник
ispunct(int c)
remove_if () уже упоминалось. Но с C ++ 0x вместо этого вы можете указать предикат для него с помощью лямбда.
Ниже приведен пример с 3 различными способами фильтрации. "Копировать" версии функций также включены для случаев, когда вы работаете с константой или не хотите изменять оригинал.
источник
Вот другое решение для всех, кого это интересует. Он использует новый диапазон For в c ++ 11
источник
str2
инициализация не требуется. (2)str = std::move(str2)
было бы более эффективным.Боюсь, что для std :: string такого члена нет, но вы можете легко запрограммировать такие функции. Возможно, это не самое быстрое решение, но этого будет достаточно:
РЕДАКТИРОВАТЬ: Прочитав ответ ниже, я понял, что он более общий, а не только для обнаружения цифры. Вышеупомянутое решение будет опускать каждый символ, переданный во второй строке аргумента. Например:
Приведет к
источник
Примечание: возможно, вам нужно написать,
ptr_fun<int, int>
а не простоptr_fun
источник
std::cref
илиstd::function
(или лямбды).Да, вы можете использовать функцию isdigit () для проверки цифр :)
Ну вот:
Надеюсь, поможет :)
источник
boost::is_any_of
Удалите все символы из одной строки, которые появляются в другой данной строке:
Протестировано в Ubuntu 16.04, Boost 1.58.
источник
Если у вас есть доступ к компилятору, который поддерживает вариативные шаблоны, вы можете использовать это:
источник
Вот еще одна альтернатива:
Работает с std :: string и std :: wstring
источник
Я новичок, но некоторые из приведенных выше ответов безумно сложны, поэтому вот альтернатива.
ПРИМЕЧАНИЕ. Пока 0–9 являются смежными (что должно соответствовать стандарту), это должно отфильтровать все другие символы, кроме цифр и ". Зная, что 0-9 должны быть смежными, а char действительно является int, мы можем сделать следующее.
РЕДАКТИРОВАТЬ: Я не заметил, что на плакате тоже нужны пробелы, поэтому я изменил его ...
Ниже приведена фильтрация предоставленных символов.
источник
Использование std :: wstring и wchar_t (требуется заголовок Unicode ):
... модный инициализатор статического диапазона далее; нет необходимости точно так же настраивать badChars2. Это перебор; академичнее всего:
Простая и лаконичная лямбда:
Удаляет все плохие символы с телефона
Выход: "555 5555555"
источник
Для тех из вас, кто предпочитает более сжатый и легкий для чтения стиль лямбда-кодирования ...
В этом примере из широкой строки удаляются все не буквенно-цифровые символы и символы пробела. Вы можете смешать его с любым другим ctype.h вспомогательной функцией чтобы удалить сложные на вид символьные тесты.
(Я не уверен, как эти функции будут обрабатывать языки CJK, так что не торопитесь.)
Посмотрите, не кажется ли вам это проще для понимания, чем шумные циклы C / C ++ для / итератора:
Результат newLabel после выполнения этого кода: " 1ReplenMoveRPMV "
Это чисто академический вопрос, так как было бы явно более точным, кратким и эффективным объединить логику if из lambda0 (сначала for_each ) в одну lambda1 (вторая for_each ), если вы уже установили, какие символы являются «badChars» .
источник
Много хороших ответов, вот еще один способ очистить строку чисел - это не удаление символов, а удаление чисел.
источник