Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
#1

Класс, который удаляет из строки все пробелы - C++

17.03.2012, 02:37. Просмотров 732. Ответов 5
Метки нет (Все метки)

Нужен класс, который удаляет из строки все пробелы.
Как сие лучше реализовать?
Придумалось вот такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <string>
#include <algorithm>
 
class EraseChar
{
    // Удаляемый символ
    enum{CHAR = ' '};
    // Это сама строка
    std::string str;
    // Функция удаляет из строки str символ CHAR
    void eraseChar() {
        str.erase(std::remove(str.begin(), str.end(), CHAR), str.end());
    }
public:
    EraseChar(){}
    EraseChar(std::string& s): str(s) {eraseChar();}
    EraseChar(char* pch): str(pch) {eraseChar();}
    operator const std::string& () const {return str;}
};
int main ()
{
    std::string s(" He ll o, wo rld ! ");
    EraseChar ec(s);
    s = ec;
    std::cout << s << std::endl;
    ec = " I S D ";
    std::cout << (std::string)ec << std::endl;
}
Добавлено через 19 минут
А может лучше как-то через статическую функцию реализовать?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2012, 02:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс, который удаляет из строки все пробелы (C++):

Описать функцию, которая удаляет из строки все лишние пробелы - C++
Помогите пожалуйста решить! Заранее благодарен!) Описать функцию, которая удаляет из строки все лишние пробелы. Пробелы считаются...

Функция удаляет начальные пробелы из строки... - C++
Написать функцию которая удаляет начальные пробелы из строки, полученной в качестве аргумента.. В паскале function LTrim(st:...

Написать функцию, которая удаляет все лишние пробелы - C++
Доброго дня суток. Помогите пожалуйста.. Нужно написать функцию, которая удаляет все лишние пробелы, т. е. из нескольких подряд идущих...

Функция, которая удаляет начальные и конечные пробелы из строки - C++
Написать функцию, которая удаляет начальные и конечные пробелы из строки, полученной в качестве аргумента Добавлено через 1 час 33...

Функция удаляет из строки пробелы и вставляет межу словами по 2 символа - C++
Добрый день, помогите пожалуйста с решением данной задачи: С клавиатуры вводится строка, которая состоит из слов, разделенных одним...

Программа, которая удаляет из введенной с клавиатуры строки начальные пробелы - C++
программу, которая удаляет из введенной с кла¬виатуры строки начальные пробелы.

5
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
17.03.2012, 02:49 #2
Цитата Сообщение от Konstantin_D Посмотреть сообщение
Как сие лучше реализовать?
Такой класс имеет смысл делать только в виде функтора.
1
Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
17.03.2012, 03:14  [ТС] #3
Так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <string>
#include <algorithm>
 
class EraseChar
{
    // Удаляемый символ
    char ch;
    // Это сама строка
    std::string str;
    // Функция удаляет из строки str символ CHAR
    void eraseChar() {
        str.erase(std::remove(str.begin(), str.end(), ch), str.end());
    }
public:
    EraseChar(char chr = ' '): ch(chr) {}
    const std::string& operator()(char* pch) {
        str = std::string(pch); 
        eraseChar();
        return str;
    }
    const std::string& operator()(std::string& s) {
        str = s; 
        eraseChar();
        return str;
    }
    operator const std::string& () const {return str;}
};
int main ()
{
    EraseChar ec;
    std::string s(" He ll o, wo rld ! ");
    s = ec(s);
    std::cout << s << std::endl;
}
0
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.03.2012, 03:53 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <functional>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
 
class erase_char : public std::unary_function<std::string, void> {
   char symb;
public:
   explicit erase_char(char c) : symb(c) {}
   void operator () (std::string& s) const
   {
      s.erase(std::remove(s.begin(), s.end(), symb), s.end());
   }
};
 
int main()
{
    std::vector<std::string> vec = { "H   ell o ", "  wor         ld", "thi  s", "  i   s  " };
    std::for_each(vec.begin(), vec.end(), erase_char(' '));
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}
1
Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
17.03.2012, 04:54  [ТС] #5
Цитата Сообщение от Jupiter Посмотреть сообщение
C++
1
    std::vector<std::string> vec = { "H   ell o ", "  wor         ld", "thi  s", "  i   s  " };
error: 'vec': non-aggregates cannot be inialised with initializer list

Добавлено через 6 минут
Немного упростился класс, но как его теперь заставить с Си-строками работать?
C++
1
erase_char ec(' '); ec("H   ell o ");
Добавлено через 28 минут
И где возникнут проблемы при работе функтора (или предиката) с STL, если он не наследован от классов unary_function и binary_function?
0
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
17.03.2012, 12:20 #6
Цитата Сообщение от Konstantin_D Посмотреть сообщение
error: 'vec': non-aggregates cannot be inialised with initializer list
Эта возможность появилась в последней версии стандарта С++(С++11), ваш компилятор может этого не поддерживать.

Цитата Сообщение от Konstantin_D Посмотреть сообщение
Немного упростился класс, но как его теперь заставить с Си-строками работать?
C++
1
erase_char ec(' '); ec("H ell o ")
C++
1
2
3
4
5
6
void operator()(char* s) const
{
   size_t n = std::strlen(s);
   char* end = std::remove(s, s + n, symb);
   *end = '\0';
}
естественно это касается символьных массивов, а не строковых литералов.
Цитата Сообщение от Konstantin_D Посмотреть сообщение
И где возникнут проблемы при работе функтора (или предиката) с STL, если он не наследован от классов unary_function и binary_function?
При использовании совместно с std::not1, std::bind1st и т.д. В данном случае практической пользы от наследования нет.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2012, 12:20
Привет! Вот еще темы с ответами:

Написать программу, которая удаляет из введенной с клавиатуры строки начальные пробелы. - C++
Написать программу, которая удаляет из введенной с клавиатуры строки начальные пробелы.

Написать программу, которая удаляет конечные пробелы из введенной с клавиатуры строки - C++
Написать программу, которая удаляет конечные пробелы из введенной с клавиатуры строки.

Написать программу, которая удаляет из введенной с клавиатуры строки конечные пробелы - C++
Пожалуйста помогите... Написать программу, которая удаляет из введенной с клавиатуры строки конечные пробелы. заранее спасибо

Функция которая удаляет начальные и конечные пробелы из строки, полученной в качестве аргумента - C++
Нужен код без использования strlen


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
17.03.2012, 12:20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru