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;
}

ведь не в граблях дело. Это очевидные вещи. И понятно, что в окнечном коде можно все это предусмотреть, хотя не обязательно.
Исключения можно оставить на совесть вызывающего. Что он хочет получить если передает нулевой указатель?
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 и конструктор выкинет исключение.

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