Привет!
Хочу придумать функцию replace для LPTSTR. Т.е. замена подстроки в строке. Для этого хочу внутри этой функции создать на основе LPTSTR std::string, вызвать у std::string метод replace и снова запихать результат в LPTSTR..
Помогите осуществить эту идею.. Не мог бы кто-нибудь набросать алгоритм или хотя бы помогите сконвертить LPTSTR в std::string и обратно
Здравствуйте, drmorg, Вы писали:
D>Помогите осуществить эту идею.. Не мог бы кто-нибудь набросать алгоритм или хотя бы помогите сконвертить LPTSTR в std::string и обратно
Может тогда стоит использовать не std::string, а std::basic_string<TCHAR> ? Тогда ничего конвертировать не надо будет. Или тебе нужно работать именно с однобайтным string ?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Может тогда стоит использовать не std::string, а std::basic_string<TCHAR> ? Тогда ничего конвертировать не надо будет. Или тебе нужно работать именно с однобайтным string ?
Нет.. в принципе и с двух байтным можно..
Я читаю и разбираю xml
Получаю параметры в LPTSTR
В одном из LPTSTR у меня есть такое
Уважаемый %user%!
C %fromdate% до %todate% Мы будем проводить ... бла-бла-бла
Я хочу заменить эти %param% на свои значения и получить хороший LPTSTR...
Вот и все..
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, 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();
}
//и перегружай сколько хочешь. это пока только идея. остальное уже применительно к необходимому алгоритму
Здравствуйте, 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();
}
//и перегружай сколько хочешь. это пока только идея. остальное уже применительно к необходимому алгоритму
Это не есть хороший пример не будет (не должен) компилироваться. c_str возвращает константный указатель.
возращаемый указатель будет не действительным.
нужно быть готовым к тому, что _tcsOrg может быть ==NULL и конструктор выкинет исключение.
Короче, ты наступил на все возможные грабли, из-за которых я не стал приводить конкретный пример
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД> Это не есть хороший пример КД> КД>не будет (не должен) компилироваться. c_str возвращает константный указатель. КД>возращаемый указатель будет не действительным. КД>нужно быть готовым к тому, что _tcsOrg может быть ==NULL и конструктор выкинет исключение. КД>
КД>Короче, ты наступил на все возможные грабли, из-за которых я не стал приводить конкретный пример
Я приводил не рабочий код, а вариант решения алгоритма. Если бы я навернул обход всех граблей, то алгоритм смотрелся бы сложнее.
Комментировать не меня нужно было, а просто дополнить мой код, если ты человеку хотел подробнее описать. В твоих объяснениях я не увидел намека на алгоритм.
ведь не в граблях дело. Это очевидные вещи. И понятно, что в окнечном коде можно все это предусмотреть, хотя не обязательно.
Исключения можно оставить на совесть вызывающего. Что он хочет получить если передает нулевой указатель?