Как искать и удалять символы в строке

Я пытаюсь преобразовать файлы .fsp в строки, но новый файл .fsp очень ненормальный. Он содержит некоторые нежелательные символы, которые я хочу удалить из строки. Как я могу это сделать?

Я пытался искать char в строке и удалять их, но я не знаю, как это сделать.

Строка выглядит так:

строка с;

s = 144˙037˙412˙864;

и мне нужно сделать это именно так

s = 144037412864;

Поэтому я исключаю такой результат:

string s = 144037412864;

Спасибо за помощь.

Вы пробовали решение, например. Как найти и заменить строку? или других существующих вопросов по этой теме? И почему они не решили вашу проблему?

t.niese 29.05.2019 08:02

Возможный дубликат Как найти и заменить строку?

t.niese 29.05.2019 08:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
511
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Эта проблема состоит из двух частей: сначала нам нужно идентифицировать любые символы в строке, которые нам не нужны. Из вашего варианта использования кажется, что все, что не является числовым, должно уйти. Это достаточно просто, так как стандартная библиотека определяет функцию std::isdigit (просто добавьте следующее включение «#include <locale>»), которая принимает символ и возвращает логическое значение, указывающее, является ли символ числовым.

Во-вторых, нам нужен способ быстро и аккуратно удалить все их вхождения из строки. Таким образом, мы можем использовать идиому «Erase Remove», чтобы перебирать строку и делать то, что мы хотим.

string s = "123'4'5";
s.erase(std::remove_if (s.begin(), s.end(), [](char x)->bool {return !std::isdigit(x);}), s.end()); 

В приведенном выше фрагменте мы вызываем стирание строки, которая принимает два итератора, первый указывает, откуда мы хотим начать удаление, а второй сообщает вызову, куда мы хотим удалить. Магия этого трюка на самом деле заключается в вызове remove_if (включите для него «#include <algorithm>»). remove_if на самом деле работает, сдвигая элементы (или символы) строки вперед к концу строки.

Таким образом, "123'4'5'" становится "12345"'', затем он возвращает итератор туда, где он переместил эти символы, которые затем передаются для стирания, чтобы удалить символы, начинающиеся здесь. В итоге у нас осталось "12345", как и ожидалось.

Обновлено: забыл упомянуть, remove_if также принимает здесь предикат. Я использую лямбду, которая принимает символ и возвращает логическое значение.

Ответ принят как подходящий

Мы можем использовать идиомы удаления-стирания для удаления ненужных символов из строки! В <algorithm> есть функция, которая называется remove_if. Что делает remove_if, так это удаляет элементы, соответствующие некоторому предикату. remove_if возвращает итератор, указывающий на новый конец контейнера после удаления всех элементов. Я покажу вам, как написать функцию, которая выполняет эту работу!

#include <algorithm>
#include <string>

void erase_ticks(std::string& s) {
    // Returns true for characters that should be removed
    auto condition = [](char c) { return c == '`'; }; 

    // Removes characters that match the condition, 
    // and returns the new endpoint of the string
    auto new_end = std::remove_if (s.begin(), s.end(), condition); 

    // Erases characters from the new endpoint to the current endpoint
    s.erase(new_end, s.end()); 
}

Мы можем использовать это в main, и оно работает так, как ожидалось!

#include <iostream>

int main() {
    std::string s("123`456`789"); 
    std::cout << s << '\n'; // prints 123`456`789
    erase_ticks(s);
    std::cout << s << '\n'; // prints 123456789
}

Измените символ на «˙», а не на «`».

Adam 29.05.2019 12:48

Это юникод или ascii? Есть небольшое изменение, которое мне придется внести, если это Unicode и имеет кодовую точку больше байта в UTF-8.

Alecto Irene Perez 29.05.2019 12:56

Вероятно, это кодировка Windows (CP1250). Речь идет о протоколе Windows .fsp, который включает информацию о пространстве на жестком диске.

Adam 29.05.2019 13:33

Другие вопросы по теме