Я пытаюсь преобразовать файлы .fsp в строки, но новый файл .fsp очень ненормальный. Он содержит некоторые нежелательные символы, которые я хочу удалить из строки. Как я могу это сделать?
Я пытался искать char в строке и удалять их, но я не знаю, как это сделать.
Строка выглядит так:
строка с;
s = 144˙037˙412˙864;
и мне нужно сделать это именно так
s = 144037412864;
Поэтому я исключаю такой результат:
string s = 144037412864;
Спасибо за помощь.
Возможный дубликат Как найти и заменить строку?
Эта проблема состоит из двух частей: сначала нам нужно идентифицировать любые символы в строке, которые нам не нужны. Из вашего варианта использования кажется, что все, что не является числовым, должно уйти. Это достаточно просто, так как стандартная библиотека определяет функцию 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
}
Измените символ на «˙», а не на «`».
Это юникод или ascii? Есть небольшое изменение, которое мне придется внести, если это Unicode и имеет кодовую точку больше байта в UTF-8.
Вероятно, это кодировка Windows (CP1250). Речь идет о протоколе Windows .fsp, который включает информацию о пространстве на жестком диске.
Вы пробовали решение, например. Как найти и заменить строку? или других существующих вопросов по этой теме? И почему они не решили вашу проблему?