Копирование LPCTSTR в LPCTSTR
От: solowey  
Дата: 25.07.09 21:41
Оценка: :)))

Ни как не могу правильно скопировать строку в строку.
LPCTSTR s1 = L"test ";
LPCTSTR s2 = L"";
LPCTSTR s3 = L"проба";
Если присваивать s2=s1; ,то при присвоение s1=s3; значение s2 меняется на s3, а мне это не нужно. Как провильно скопировать значения?
Re: Копирование LPCTSTR в LPCTSTR
От: Ovl Россия  
Дата: 25.07.09 21:54
Оценка:
Здравствуйте, solowey, Вы писали:

S>

S>Ни как не могу правильно скопировать строку в строку.
S>LPCTSTR s1 = L"test ";
S>LPCTSTR s2 = L"";
S>LPCTSTR s3 = L"проба";
S>Если присваивать s2=s1; ,то при присвоение s1=s3; значение s2 меняется на s3, а мне это не нужно. Как провильно скопировать значения?

в LPCTSTR — никак. надо сначала убрать константность. если бы был LPTSTR, то надо выделить памяти для новой строки и скопировать с помощью _tstrcpy
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re: Копирование LPCTSTR в LPCTSTR
От: Васильич  
Дата: 26.07.09 19:21
Оценка:
Здравствуйте, solowey, Вы писали:

S>Ни как не могу правильно скопировать строку в строку.

S>LPCTSTR s1 = L"test ";
S>LPCTSTR s2 = L"";
S>LPCTSTR s3 = L"проба";
S>Если присваивать s2=s1; ,то при присвоение s1=s3; значение s2 меняется на s3, а мне это не нужно. Как провильно скопировать значения?

Макрос LPCTSTR разворачивается в const TCHAR*. Соответственно, s2 = s1 есть ни что иное, как обычное присваивание указателей. Чтобы скопировать строку, необходимо воспользоваться макросом _tcscpy. Пример:

LPCTSTR s1 = L"test ";
TCHAR s2[6];

_tcscpy(s2, s1);

Ни в коем случае нельзя копировать один LPCTSTR в другой LPCTSTR (если только под второй явно не выделялась память), иначе получаем UB.
Re[2]: Копирование LPCTSTR в LPCTSTR
От: MasterZiv СССР  
Дата: 27.07.09 06:13
Оценка: +1 :)
Васильич пишет:

> Ни в коем случае нельзя копировать один LPCTSTR в другой LPCTSTR (если

> только под второй явно не выделялась память), иначе получаем UB.

Я хочу подчеркнуть сомнительность вышеприведённой фразы, ведь это
могут прочитать и "слабые духом", начинающие программисты.

Утверждение
"Ни в коем случае нельзя копировать один LPCTSTR в другой LPCTSTR",
если под "копировать" понимать применение оператора присываивания
или его семантического эквивалента, безусловно является неверным.
Присваивать один const char* (или char*) другому МОЖНО, и даже
порой НУЖНО. Но только нужно чётко понимать, что ты делаешь.
А именно -- создаёшь новую ссылку на ТОТ ЖЕ САМЫЙ "объект строки",
хотя конечно никакого объекта строки в С/С++ не существует.
Если это то, что тебе нужно, то -- вперёд. Если нет -- то нет.

Да, и это почти никак не связано ни с UB, ни с выделением памяти.
(ну то есть в принципе всё программирование в С/С++ как-то связано
и с тем, и с другим).
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Копирование LPCTSTR в LPCTSTR
От: Васильич  
Дата: 27.07.09 06:46
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Васильич пишет:


>> Ни в коем случае нельзя копировать один LPCTSTR в другой LPCTSTR (если

>> только под второй явно не выделялась память), иначе получаем UB.

MZ>Я хочу подчеркнуть сомнительность вышеприведённой фразы, ведь это

MZ>могут прочитать и "слабые духом", начинающие программисты.

MZ>Утверждение

MZ>"Ни в коем случае нельзя копировать один LPCTSTR в другой LPCTSTR",
MZ>если под "копировать" понимать применение оператора присываивания
MZ>или его семантического эквивалента, безусловно является неверным.
MZ>Присваивать один const char* (или char*) другому МОЖНО, и даже
MZ>порой НУЖНО. Но только нужно чётко понимать, что ты делаешь.
MZ>А именно -- создаёшь новую ссылку на ТОТ ЖЕ САМЫЙ "объект строки",
MZ>хотя конечно никакого объекта строки в С/С++ не существует.
MZ>Если это то, что тебе нужно, то -- вперёд. Если нет -- то нет.

MZ>Да, и это почти никак не связано ни с UB, ни с выделением памяти.

MZ>(ну то есть в принципе всё программирование в С/С++ как-то связано
MZ>и с тем, и с другим).

Да, конечно, я не до конца доформулировал, в целях простоты обьяснения. Я имел в виду, что написав, как в примере, что-то вроде:

LPCTSTR s1 = L"sss";
LPCTSTR s2 = L"";

_tcscpy(s2, s1);


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