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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.63
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,465
#1

std::string Трим - C++

15.02.2010, 18:00. Просмотров 4579. Ответов 14

Как сделать трим (вырезание из начала\конца строки лишних символов таких как пробелы, табуляции...) в std::string? Я недавно нашёл у себя в коде такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    void LTrim(std::string* String, const char* Trim)
    {
        int i = 0;
        while ( Trim[i] )
        {
            // Если текущий символ - трим-символ
            if ( (*String)[0] == Trim[i] )
            {
                //удаляем его и начинаем проверку заново
                String->erase(0, 1);
                i = 0;
                continue;
            }
            // Следующий символ считающийся Trim
            i++;
        }
    }
Мне кажется это страшная вещь Как сделать правильно?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2010, 18:00     std::string Трим
Посмотрите здесь:

Std::string - C++
никак не пойму чем отличаются методы append и assign у std::string?

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

std:string - C++
1. Поддерживает ли этот класс сравнение целиком строк? Каков синтаксис сравнения строк? 2. Поддерживает ли этот класс конкатенацию? Каков...

std::string - C++
Здравствуйте! У меня есть std::vector<std::string> Подскажите пожалуйста как быстро и красиво можно перевести i-тый элемент вектора в...

PTCHAR в std::string - C++
Никак не могу парсить переменную Line. Пишет - выражение должно иметь тип класса PTCHAR line = wcstok_s(buffer, TEXT("\r\n"), &context);...

Аналог std::string - C++
Имеется некоторый класс, обеспечивающий работу с символами UTF-8. Назовём его uchar. Можно ли простым способом организовать класс ustring,...

std::string в char* - C++
Можно ли привести std::string к указателю на нуль-терминальную строку? Как?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mirso
524 / 342 / 17
Регистрация: 05.04.2009
Сообщений: 709
21.02.2010, 21:42     std::string Трим #2
insideone,
Цитата Сообщение от insideone Посмотреть сообщение
вырезание из начала\конца строки лишних символов таких как пробелы, табуляции
Вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <ctype.h>
 
int main()//=========================================================
{
    std::string s = "   a b  c     ";
 
    std::cout << '>' << s << "<\n";
    //---------------------------------------------------------
    while ( isspace( *s.begin() ) ) s.erase(0, 1);
    while ( isspace( *--s.end() ) ) s.erase(s.length() - 1, 1);
    //---------------------------------------------------------
    std::cout << '>' << s << '<';    
   
    return 0;
}//==================================================================
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,465
21.02.2010, 21:53  [ТС]     std::string Трим #3
2 mirso довольно кратно и понятно, однако мне как раз и не хочется вызвать .erase много раз. Пожалуй лучшим способом будет нахождение последнего (x) пробела с начала строки и .erase(0, x). Тоже самое с тримом справа. Просто у меня операция трима достаточно частоприменяемая и влияет на загрузку приложения в целом, поэтому хотелось сделать как можно лучше)
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
21.02.2010, 21:56     std::string Трим #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
void Delete(std::string &s)
{
      int i = 0, j = s.size()-1;
      while (s[i] == ' ' || s[i] == '\t') ++i;
      while (s[j] == ' ' || s[j] == '\t') --j;
      s = s.substr(i, s.size() - (i + (s.size()-j+1)) );
}
Добавлено через 1 минуту
insideone, писал на форуме, продебаж и исправь ошибки..
@KOT@
81 / 39 / 2
Регистрация: 29.01.2010
Сообщений: 386
21.02.2010, 22:00     std::string Трим #5
Цитата Сообщение от insideone Посмотреть сообщение
i = 0;
Помоему не надо делать и нулевым - зачем перебирать массив с самого начала? (или может я что-то не понял)
i-=1


Цитата Сообщение от insideone Посмотреть сообщение
Пожалуй лучшим способом будет нахождение последнего (x) пробела с начала строки и .erase(0, x). Тоже самое с тримом справа.
не совсем понял. Чем это отличается от предыдущего?
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,465
21.02.2010, 22:16  [ТС]     std::string Трим #6
2 outoftime Выглядит отлично, спасибо

Помоему не надо делать и нулевым - зачем перебирать массив с самого начала? (или может я что-то не понял)
i-=1
Ну а как же ещё. Может первый символ и есть пробел
не совсем понял. Чем это отличается от предыдущего?
Функция вызываемая в цикле и функция вызываемая 1 раз это разные вещи))
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
21.02.2010, 22:25     std::string Трим #7
insideone, я вот не знаю что будет быстрее брать трижды s.size() или сохрать размер в переменную int sz= s.size(); и далее производить вычисления..
И если уже совсем на оптимизацию сойти, то быстрее юзать сишные строки..
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,465
21.02.2010, 22:43  [ТС]     std::string Трим #8
Цитата Сообщение от outoftime Посмотреть сообщение
я вот не знаю что будет быстрее брать трижды s.size() или сохрать размер в переменную int sz= s.size(); и далее производить вычисления..
Наверное сохранять размер в переменной лучше, я читал что в стеке память выделяется шустро.

И если уже совсем на оптимизацию сойти, то быстрее юзать сишные строки..
Да я то с удовольствием просто эта строка считывается из файла через getline. Приходится в std::string. Нет. я конечно понимаю что считываь можно и по другому, просто так как то удобнее...
mirso
524 / 342 / 17
Регистрация: 05.04.2009
Сообщений: 709
21.02.2010, 22:49     std::string Трим #9
outoftime,
Цитата Сообщение от outoftime Посмотреть сообщение
s = s.substr(i, s.size() - (i + (s.size()-j+1)) );
обрезает последний символ
-------------------------------
так работает нормально
C++
1
s = s.substr(i, j - i + 1  );
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
21.02.2010, 23:15     std::string Трим #10
вроде работает...
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
#include <iostream>
#include <string>
 
std::string& trimStr(std::string& s){
    static const std::string SPACES(" \t\n");
    size_t head = s.find_first_not_of(SPACES);
    if ( head == std::string::npos )
        return s = "";
    else if ( head > 0 )
        s.erase(0, head);
    size_t tail = s.find_last_not_of(SPACES);
    if ( tail != s.size() - 1 )
        s.erase(tail + 1);
    return s;
}
 
int main(){
    std::string str;
    while ( true ){
        std::cout << "String: ";
        std::getline(std::cin, str);
        if ( str.empty() )
            break;
        std::cout << "Befor: \"" << str << "\"" << std::endl;
        trimStr(str);
        std::cout << "After: \"" << str << "\"" << std::endl;
    }
    
    return 0;
}
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,465
21.02.2010, 23:26  [ТС]     std::string Трим #11
Цитата Сообщение от easybudda Посмотреть сообщение
вроде работает...
работает. этот вариант хорош тем что расширяем - можно выбирать что считать за лишний символ, удобно
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
21.02.2010, 23:41     std::string Трим #12
Цитата Сообщение от insideone Посмотреть сообщение
этот вариант хорош тем что расширяем - можно выбирать что считать за лишний символ
Ага... Немного переделав, можно, как дополнительный параметр, передавать строку символов для удаления...
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,465
21.02.2010, 23:46  [ТС]     std::string Трим #13
C++
1
2
3
4
5
6
7
8
9
10
11
12
std::string& trimStr(std::string& s, std::string SPACES){
        //static const std::string SPACES(" \t\n");
        size_t head = s.find_first_not_of(SPACES);
        if ( head == std::string::npos )
                return s = "";
        else if ( head > 0 )
                s.erase(0, head);
        size_t tail = s.find_last_not_of(SPACES);
        if ( tail != s.size() - 1 )
                s.erase(tail + 1);
        return s;
}
Пожалуй так?
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
22.02.2010, 00:09     std::string Трим #14
Цитата Сообщение от insideone Посмотреть сообщение
std::string& trimStr(std::string& s, std::string SPACES)
лучше
C++
1
std::string& trimStr(std::string& s, const std::string& SPACES = " \t\n")
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2011, 01:48     std::string Трим
Еще ссылки по теме:

char* vs std::string - C++
При чтении чужих сорцов, обратил внимание, что в роли аргументов для функций/методов, как правило используются указатели на массивы чаров,...

int to std::string - C++
Не подскажите как перевести int в std::string

Std::string compare - C++
#include &lt;cstring&gt; #include &lt;iostream&gt; int main() { std::string a = &quot;aa&quot;; std::string b = &quot;ab&quot;; std::cout &lt;&lt;...

std::string, потоки - C++
Доброго времени суток! Использую такую конструкцию: while(...) { while(getline(dic, buf2)) { if (buf2 &lt;...

std::string to SCtring - C++
После выполнения этого кода выводится не &quot;123&quot; а какие-то каракули как это исправить? string s = &quot;123&quot;; ...


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

Или воспользуйтесь поиском по форуму:
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
13.03.2011, 01:48     std::string Трим #15
Подниму тему.
Объясните пожалуйста, почему в CString методы Trim/TrimLeft/TrimRight - реализованы, а в обычном string - нет?
На это есть реальные причины?
Yandex
Объявления
13.03.2011, 01:48     std::string Трим
Ответ Создать тему
Опции темы

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