Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > trim для wstring или string


Автор: ksili 26.1.2009, 12:29
Надо в строке типа wstring или string обрезать с конца непечатные символы и пробелы. Типа метода Trim для AnsiString. 
В MSDN ничего такого не нашёл.

Автор: andrew_121 26.1.2009, 12:36
ksili, Такого метода нет.
Используй std::find() и std::copy().
P.S.
А что такое AnsiString?

Автор: mes 26.1.2009, 12:38
http://www.boost.org/doc/libs/1_37_0/doc/html/string_algo/usage.html#id3677329

Добавлено через 1 минуту и 21 секунду
Цитата(andrew_121 @  26.1.2009,  11:36 Найти цитируемый пост)
AnsiString

это борландский тип строки, пришедший в с++ с дельфи.

Автор: andrew_121 26.1.2009, 12:44
mes, Приведенная Вами ссылка, это часть boost(а), а он не является пока что стандартом. имхо.

Автор: mes 26.1.2009, 12:47
Цитата(andrew_121 @  26.1.2009,  11:44 Найти цитируемый пост)
Приведенная Вами ссылка, это часть boost(а), а он не является пока что стандартом. имхо. 

я в курсе, но где в вопросе было указано что  требуется только из стл ?
раз в std нету приходится искать другие варианты, или делать самому.
 

Автор: ksili 26.1.2009, 12:48
Чтобы подключить boost, я прописал:
Код

#include <boost/algorithm/string.hpp>
using namespace boost;

как показано по ссылке
Но boost не появился. Что ещё надо сделать?

Добавлено через 5 минут и 21 секунду
Т.е. не найден файл <boost/algorithm/string.hpp>

Автор: mes 26.1.2009, 12:54
http://bionica.wikidot.com/bionica:boost
http://www.google.com/search?hl=ru&q=%F3%F1%F2%E0%ED%EE%E2%E8%F2%FC+boost&btnG=%CF%EE%E8%F1%EA+%E2+Google&lr=

Автор: ksili 26.1.2009, 12:54
Пишу в 2005 студии

Автор: vinter 26.1.2009, 12:54
ksili, скачать его smile

Автор: ksili 26.1.2009, 13:02
понятно, буду качать

Автор: andrew_121 26.1.2009, 13:35
ksili, Капец smile  Ради нескольких функции тягать за прогой слона, не есть разумно.

Автор: bsa 26.1.2009, 15:09
ksili, а сам не можешь написать эту функцию?
Код
for(int pos = text.size() - 1; pos >= 0; --pos) {
   if ( !std::isspace(text[pos]) ) {
       text.resize(pos + 1);
       break;
   }
}

Автор: Lazin 26.1.2009, 15:19
Цитата(andrew_121 @  26.1.2009,  13:35 Найти цитируемый пост)
ksili, Капец smile  Ради нескольких функции тягать за прогой слона, не есть разумно

а это очень удобно, так-как за несколькими ф-ями понадобится еще несколько, потом понадобится работать с потоками, потом с еще что-нибудь...
если подключить один заголовочный файл, скажем boost/algorithm/string.hpp, то он не потянет весь буст, а только то что нужно и не больше, собирать в данном случае ничего не нужно, только директории настроить
Цитата(bsa @  26.1.2009,  15:09 Найти цитируемый пост)
ksili, а сам не можешь написать эту функцию?

я думаю что может, но зачем заниматься изобретением(и сопровождением) велосипеда, вместо того что-бы решать задачу? smile 

Автор: bsa 26.1.2009, 15:39
Вообще-то, установка буста занимает пол дня, особенно, когда делаешь это впервые.

Автор: mrbrooks 26.1.2009, 15:50
Цитата(bsa @  26.1.2009,  15:39 Найти цитируемый пост)
Вообще-то, установка буста занимает пол дня, особенно, когда делаешь это впервые. 

хм. у меня за час студия буст собрала  smile 

Автор: vinter 26.1.2009, 16:05
Цитата(bsa @  26.1.2009,  16:39 Найти цитируемый пост)
Вообще-то, установка буста занимает пол дня, особенно, когда делаешь это впервые.

у меня 30 минут ушло, ниче не коиплили, ниче не собирал. Скачал установщик, прописал пути и все.

Автор: Lazin 26.1.2009, 16:06
Цитата(bsa @  26.1.2009,  15:39 Найти цитируемый пост)
Вообще-то, установка буста занимает пол дня, особенно, когда делаешь это впервые.

stirng algo - это header only библиотека, ее собирать не нужно

Автор: andrew_121 26.1.2009, 17:58
Цитата(Lazin @  26.1.2009,  16:06 Найти цитируемый пост)
stirng algo - это header only библиотека, ее собирать не нужно 

Спасибо!!! Учту.

Автор: Vyacheslav 26.1.2009, 19:17
Любопытно, а могут  ли сегодня  обойтись без boost?
Похоже пора менять приоритеты при проведении интервью. Если раньше  знание и применение  boost  было признаком  высокой квалификации, то в настоящее время - это может  оказаться признаком неумения программировать  smile 
 
Код


#include <string>
#include <iostream>
#include <functional>
#include <algorithm> 
using namespace std;


string  rtrim( string str )
{
 str.erase( find_if(str.rbegin(), str.rend(), bind2nd(not_equal_to<char>(),' ')).base(), str.end());
 return str;
}

string  ltrim( string str )
{
  str.erase( str.begin(), find_if(str.begin(), str.end(), bind2nd(not_equal_to<char>(),' ')) );
  return str;
}

string  trim( string str )
{
    return ltrim(rtrim(str));
}

int _tmain(int argc, _TCHAR* argv[])
{
    
    string str = "   abcd    ";

    cout << "*" << trim(str) << "*"  << endl;
    cout << "*" << str << "*" ;
    return 0;
}



Автор: vinter 26.1.2009, 20:48
Vyacheslav, какой смысл вечно писать велосипеды?

Автор: Rififi 26.1.2009, 20:56
Vyacheslav, 
зубы можно и пальцем почистить, но удобнее это делать зубной щеткой.

Автор: andrew_121 26.1.2009, 22:34
vinter, 
Rififi, Ну вы и критики парни ))) Просто таким макаром, скоро может оказаться, что алгоритмы забудутся вопще...
А если учесть что, это весьма примитивный алгоритмик, то неумение реализовать его, постыдно. имхо.
Хотя...все относительно smile 

Автор: mes 26.1.2009, 22:50
Цитата(andrew_121 @  26.1.2009,  21:34 Найти цитируемый пост)
А если учесть что, это весьма примитивный алгоритмик, то неумение реализовать его, постыдно. имхо.
Хотя...все относительно smile  

ну у std::max()  тоже примитивный алгоритм, однако предпочтительнее использовать его, а не условие
И дело в общем то не в умении применять алгоритм, а в удобстве чтения , точнее сказать  в удобстве сопровождения кода.
Чем меньше будет нагрузка на мозги, тем полноценее будет отдача проекту в решении требуемой задачи.
А для того чтоб знать и разбираться в алгоритмах, не надо их впихивать в прогу направо и налево.


Автор: andrew_121 26.1.2009, 23:05
Опять риторика...

Автор: vinter 27.1.2009, 06:11
andrew_121, никаких риторик, надо решать конкретную задачу. Если эта задача состоит в написании своей версии, значит не юзаем буст. Если нет, то юзаем и не отвлекаемся на написание всего подряд.

Автор: ksili 27.1.2009, 06:31
Цитата(bsa @ 26.1.2009,  19:09)
ksili, а сам не можешь написать эту функцию?
Код
for(int pos = text.size() - 1; pos >= 0; --pos) {
   if ( !std::isspace(text[pos]) ) {
       text.resize(pos + 1);
       break;
   }
}

bsa, до такого кода я бы догадался, но 
Цитата

'isspace' : is not a member of 'std'


Добавлено @ 06:45
Всех непечатных символов не знаю (в этом собственно главная проблема и была)., поэтому сделал пока так:
Код

void RTrim(wstring &text)
{
    for(int pos = text.size() - 1; pos >= 0; --pos) 
    {
        if ( text[pos] == L' ' || text[pos] == L'\n' || text[pos] == L'\r' || text[pos] == 0)
            text.resize(pos);
        else
            break;
    }
}

Автор: ksili 27.1.2009, 06:58
Всем спасибо!

Автор: Vyacheslav 27.1.2009, 12:44
Цитата(vinter @  26.1.2009,  20:48 Найти цитируемый пост)
Vyacheslav, какой смысл вечно писать велосипеды? 

Ну, во-первых, Вы  переоцениваете сложность задачи. Это явно не велосипед smile

Во-вторых, в серьезных проектах выполняемых для серьезных заказчиков и поставляемых в виде кода стараются ограничить применение сторонних  библиотек свыше необходимого: стандарт + требуемые библиотеки. 

В одном из проектов кросформенного приложения( Linuх, Windows ) заказчик не разрешил поменять STL  Dinkumware на STLport, несмотря на то, что  вариант STL  Dinkumware, поставляемый в составе VC6,  на Windows приводил к утечке памяти из-за ошибки в  библиотеке . Подчеркну: к утечке памяти только на платформе Windows. Пришлось заменять код на более неуклюжий, но не приводящий к утечке и при использовании STL  Dinkumware 

Вот я и представляю диалог: П( программист) З(заказчик)
П: Вы бы не могли заэпрувить нам требования заново. У нас изменения
З: А что такое?
П: Нам необходимо использовать boost
З: А чем вызвана  эта необходимость?
П: Мне  из него нужна  функция по отсечению пробелов в строках :(
З: smile 

Это элементарная задача, и если для решения таких задач программист будет каждый раз подтягивать в приложение boost, хотя  использование его не планировалось, то боюсь наступит время, когда перед очередной элементарной задачей он спасует. Boost'а на все элементарные задачи может не хватить  smile 

А задача была элементарной
Цитата(ksili @  26.1.2009,  12:29 Найти цитируемый пост)
Надо в строке типа wstring или string обрезать с конца непечатные символы и пробелы. Типа метода Trim для AnsiString. 


Цитата(Rififi @  26.1.2009,  20:56 Найти цитируемый пост)
Vyacheslav, 
зубы можно и пальцем почистить, но удобнее это делать зубной щеткой. 

Полагаю, что если Вы окажитесь в положении, когда зубной щетки не окажется, то Вы так и будете ходить с нечищеными зубами.  smile

Добавлено @ 12:56
Цитата(ksili @  27.1.2009,  06:31 Найти цитируемый пост)
bsa, до такого кода я бы догадался, но 
Цитата

'isspace' : is not a member of 'std'


в std входит  шаблонный вариант функции, учитывающий локаль
Код

#include <locale>
void RTrim(wstring &text)
{
    static locale loc;
    for(int pos = text.size() - 1; pos >= 0; --pos) 
    {
        if ( std::isspace(text[pos], loc))
            text.resize(pos);
        else
            break;
    }
}


Автор: vinter 27.1.2009, 12:59
Цитата(Vyacheslav @  27.1.2009,  13:44 Найти цитируемый пост)
Это элементарная задача, и если для решения таких задач программист будет каждый раз подтягивать в приложение boost, хотя  использование его не планировалось, то боюсь наступит время, когда перед очередной элементарной задачей он спасует. Boost'а на все элементарные задачи может не хватить 

так то да, просто если нет ограничивающих факторов, то не вижу смысла не использовать буст

Автор: cutwater 27.1.2009, 13:07
vinter, а еще можно использовать QT ради QString у которого есть метод trim

Автор: vinter 27.1.2009, 13:20
cutwater, не путай мягкое с морковкой, boost  стандарт де факто, а QT фрейворк, который любят далеко не все.

Автор: cutwater 27.1.2009, 13:24
Просто приходим к одному и тому же... только ради 5 строк кода подтягивать ненужные зависимости.. все зависит от проекта и от его дальнейшего развития, требований к проекту. поэтому спорить тут бессмысленно.

Автор: vinter 27.1.2009, 13:30
cutwater, что значит ненужные зависимости? "если у вас еще не установлен буст тогда мы идем к вам"©, это должно быть правилом. Буст надо знать, и чем раньше ты начнешь его использовать, тем лучше.

Автор: Lazin 27.1.2009, 13:44
Цитата(cutwater @  27.1.2009,  13:07 Найти цитируемый пост)
а еще можно использовать QT ради QString у которого есть метод trim 


Цитата(cutwater @  27.1.2009,  13:24 Найти цитируемый пост)
Просто приходим к одному и тому же... только ради 5 строк кода подтягивать ненужные зависимости.. все зависит от проекта и от его дальнейшего развития, требований к проекту. поэтому спорить тут бессмысленно. 


это не верно, QString потянет за собой в production кучу всего, как минимум Qt4Core.dll, a boost string_algo это просто набор заголовочных файлов, так-что не нужно путать божий дар с яичницой smile 

Цитата

The String Algorithm Library provides a generic implementation of string-related algorithms which are missing in STL. It is an extension to the algorithms library of STL and it includes trimming, case conversion, predicates and find/replace functions. All of them come in different variants so it is easier to choose the best fit for a particular need.

The implementation is not restricted to work with a particular container (like std::basic_string), rather it is as generic as possible. This generalization is not compromising the performance since algorithms are using container specific features when it means a performance gain.

Автор: bsa 27.1.2009, 15:55
Цитата(ksili @ 27.1.2009,  06:31)
bsa, до такого кода я бы догадался, но 
Цитата

'isspace' : is not a member of 'std'

http://linux.die.net/man/3/isspace
Чтобы isspace была видна в неймспейсе std, необходимо подключить заголовочный файл ctype:
Код
#include <ctype>

Автор: cutwater 27.1.2009, 18:36
Цитата(vinter @  27.1.2009,  13:30 Найти цитируемый пост)
Буст надо знать, и чем раньше ты начнешь его использовать, тем лучше. 


Я буст знаю на достаточном для себя уровне и использую. просто считаю что он нужен там где он нужен.

Добавлено через 54 секунды
Прошу извинить, о QT пример оказался не совсем уместен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)