LPTSTR => std::string => LPTSTR
От: drmorg  
Дата: 07.07.03 08:41
Оценка:
Привет!
Хочу придумать функцию replace для LPTSTR. Т.е. замена подстроки в строке. Для этого хочу внутри этой функции создать на основе LPTSTR std::string, вызвать у std::string метод replace и снова запихать результат в LPTSTR..

Помогите осуществить эту идею.. Не мог бы кто-нибудь набросать алгоритм или хотя бы помогите сконвертить LPTSTR в std::string и обратно
Re: LPTSTR => std::string => LPTSTR
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 07.07.03 08:55
Оценка:
Здравствуйте, drmorg, Вы писали:

D>Помогите осуществить эту идею.. Не мог бы кто-нибудь набросать алгоритм или хотя бы помогите сконвертить LPTSTR в std::string и обратно


Может тогда стоит использовать не std::string, а std::basic_string<TCHAR> ? Тогда ничего конвертировать не надо будет. Или тебе нужно работать именно с однобайтным string ?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: LPTSTR => std::string => LPTSTR
От: drmorg  
Дата: 07.07.03 09:08
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Может тогда стоит использовать не std::string, а std::basic_string<TCHAR> ? Тогда ничего конвертировать не надо будет. Или тебе нужно работать именно с однобайтным string ?


Нет.. в принципе и с двух байтным можно..

Я читаю и разбираю xml
Получаю параметры в LPTSTR
В одном из LPTSTR у меня есть такое

Уважаемый %user%!
C %fromdate% до %todate% Мы будем проводить ... бла-бла-бла


Я хочу заменить эти %param% на свои значения и получить хороший LPTSTR...
Вот и все..


Слушай, а как тогда в функцию подсунуть LPTSTR ?

Допустим я написал функцию

void MyReplace(std::basic_string<TCHAR> MainStr, std::basic_string<TCHAR> oldVal, std::basic_string<TCHAR> newVal) {
...
}

Как ее вызвать???

MyReplace(&text, _T("%user%"), usr);

так?
Re[2]: LPTSTR => std::string => LPTSTR
От: Alexmoon Украина  
Дата: 07.07.03 09:27
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Здравствуйте, drmorg, Вы писали:


D>>Помогите осуществить эту идею.. Не мог бы кто-нибудь набросать алгоритм или хотя бы помогите сконвертить LPTSTR в std::string и обратно


КД>Может тогда стоит использовать не std::string, а std::basic_string<TCHAR> ? Тогда ничего конвертировать не надо будет. Или тебе нужно работать именно с однобайтным string ?


он имел ввиду, что ему нужно использовать метод replace контейнера, чтобы не придумывать алгоритм заново.

typedef std::basic_string<TCHAR, std::char_traits<TCHAR>, std::allocator<TCHAR> > _tstring;
LPTSTR replace(LPTSTR _tcsOrg, /*здесь передаешь все необходимые параметры*/)
{
   return _tstring(_tcsOrg).replace(/*здесь передаешь все необходимые параметры*/).c_str();
}
//и перегружай сколько хочешь. это пока только идея. остальное уже применительно к необходимому алгоритму
Re[3]: LPTSTR => std::string => LPTSTR
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 07.07.03 10:01
Оценка:
Здравствуйте, Alexmoon, Вы писали:

КД>>Может тогда стоит использовать не std::string, а std::basic_string<TCHAR> ? Тогда ничего конвертировать не надо будет. Или тебе нужно работать именно с однобайтным string ?


A>он имел ввиду, что ему нужно использовать метод replace контейнера, чтобы не придумывать алгоритм заново.

Ну, типа, да.

typedef std::basic_string<TCHAR, std::char_traits<TCHAR>, std::allocator<TCHAR> > _tstring;
LPTSTR replace(LPTSTR _tcsOrg, /*здесь передаешь все необходимые параметры*/)
{
   return _tstring(_tcsOrg).replace(/*здесь передаешь все необходимые параметры*/).c_str();
}
//и перегружай сколько хочешь. это пока только идея. остальное уже применительно к необходимому алгоритму


Это не есть хороший пример
  1. не будет (не должен) компилироваться. c_str возвращает константный указатель.
  2. возращаемый указатель будет не действительным.
  3. нужно быть готовым к тому, что _tcsOrg может быть ==NULL и конструктор выкинет исключение.

Короче, ты наступил на все возможные грабли, из-за которых я не стал приводить конкретный пример
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[4]: LPTSTR => std::string => LPTSTR
От: Alexmoon Украина  
Дата: 07.07.03 10:32
Оценка: 8 (1)
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД> Это не есть хороший пример

КД>

    КД>
  1. не будет (не должен) компилироваться. c_str возвращает константный указатель.
    КД>
  2. возращаемый указатель будет не действительным.
    КД>
  3. нужно быть готовым к тому, что _tcsOrg может быть ==NULL и конструктор выкинет исключение.
    КД>

КД>Короче, ты наступил на все возможные грабли, из-за которых я не стал приводить конкретный пример


Я приводил не рабочий код, а вариант решения алгоритма. Если бы я навернул обход всех граблей, то алгоритм смотрелся бы сложнее.
Комментировать не меня нужно было, а просто дополнить мой код, если ты человеку хотел подробнее описать. В твоих объяснениях я не увидел намека на алгоритм.
typedef std::basic_string<TCHAR, std::char_traits<TCHAR>, std::allocator<TCHAR> > _tstring;
LPCTSTR replace(LPTSTR _tcsOrg, /*здесь передаешь все необходимые параметры*/)
{
    LPTSTR _tcsTemp = NULL;
    try
    {
       if(!_tcsOrg && !(*_tcsOrg)) throw _T("invalid parameter");
       _tstring _str(_tcsOrg).replace(/*здесь передаешь все необходимые параметры*/);
       _tcsTemp = new TCHAR[_str.size() + 1];
       _tcscpy(_tcsTemp, _str.c_str());
    }
    catch(...)
    {
       if(!_tcsOrg) { delete _tcsTemp; _tcsTemp = NULL; }
    }
    return _tcsTemp;
}

ведь не в граблях дело. Это очевидные вещи. И понятно, что в окнечном коде можно все это предусмотреть, хотя не обязательно.
Исключения можно оставить на совесть вызывающего. Что он хочет получить если передает нулевой указатель?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.