TCHAR *str = _T("Hello");
OK.
TCHAR* str2;
ОК.
str2 = new TCHAR[23]; // let us say this is big enough
Хорошо, но должно быть в паре с delete[]
.
str2 = _T("ok");
Не работает. Перезапись указателя на new TCHAR[23];
Эта память для всех целей и целей ушла и не подлежит восстановлению.
memcpy(&str2, &str, (_tcslen(str)+1)*sizeof(TCHAR));
Не в порядке. str и str2 уже являются указателями, поэтому их адреса с &
указывают на неправильное место в памяти.
Мой крой выше:
#include "windows.h"
#include "TCHAR.H" // for _tcscpy_s
int main()
{
TCHAR * str = _T("Hello");
TCHAR * str2 = new TCHAR[23];
_tcscpy_s(str2, 23, _T("OK")); // store OK
_tcscpy_s(str2, 23, str); // Copy str
delete[] str2;
}
Что почти так же, как то, что предложил Майкл Барр. Единственными существенными отличиями являются сохранение OK и _tcscpy_s
, которые ограничивают копию до 23 символов, завершая программу при переполнении, если я правильно помню. wcsncpy_s разрешит усечение, если окончание не является вашим ответом. Не знаю, есть ли версия _t.
++ путь C будет
std::wstring str(L"Hello");
std::wstring str2(L"OK");
str2 = str; // for the copy.
str2.c_str() // to get a c style string
Edit: нужно сделать дополнительное примечание здесь. C++-путь не совсем то же самое, что и функции TCHAR. TCHAR прозрачно переключается между типами символов в зависимости от параметров, заданных во время компиляции, чтобы один и тот же источник мог быть создан для систем с широкой поддержкой символов или без них. wstring строго широк. Строки с префиксом L строго ограничены.Вы можете сделать то же самое с макросами, которые обертывают все строки и потоки, но это не будет тривиальным и eeewwwwww .... Макросы ...
'sizeof (str)' - размер указателя. Используйте 'strlen (str) + 1'. –
В Windows land у вас есть целый набор широких процедур копирования символов. [Посмотрите] (https://msdn.microsoft.com/en-us/library/td1esda9.aspx) – user4581301
Следуя @ DietmarKühl, вы также отбросили указатель, возвращенный 'new', и поэтому у вас есть утечка памяти, потому что вы не можете теперь «удалить» его. –