2015-09-02 5 views
-1

Я не знаю, почему это кажется более сложным, чем то, чем оно является! Я просто хочу заменить содержимое str2 на содержимое str, они оба являются строками. Это похоже на работу, но я не уверен, что это правильный способ сделать это ... Я использую Visual Studio 2008.лучший способ скопировать указатель TCHAR на указатель TCHAR

EDIT: Я должен использовать new для str2

TCHAR *str = _T("Hello"); 
TCHAR* str2; 
str2 = new TCHAR[23]; // let us say this is big enough 
str2 = _T("ok"); 
memcpy(&str2, &str, (_tcslen(str)+1)*sizeof(TCHAR)); 

EDIT2: Я попытался это, как Майкл предложил, но я получил access violation error :(

TCHAR *str = _T("Hello"); 
    TCHAR* str2; 
    str2 = new TCHAR[23]; // let us say this is big enough 
    str2 = _T("ok"); 
    _tcscpy(str2, str); 
+3

'sizeof (str)' - размер указателя. Используйте 'strlen (str) + 1'. –

+0

В Windows land у вас есть целый набор широких процедур копирования символов. [Посмотрите] (https://msdn.microsoft.com/en-us/library/td1esda9.aspx) – user4581301

+0

Следуя @ DietmarKühl, вы также отбросили указатель, возвращенный 'new', и поэтому у вас есть утечка памяти, потому что вы не можете теперь «удалить» его. –

ответ

2
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 .... Макросы ...

+0

это хорошо работает, спасибо. – Samer

4

Если вы хотите использовать TCHAR (который я не уверен, что я рекомендовал бы), посмотреть в tchar.h для макросов, которые дают вам TCHAR эквиваленты для всех функций strxxx(). Например, чтобы скопировать строки, основанные на TCHAR, вы можете использовать _tcscpy().

На самом деле существуют макросы для TCHAR вариантов для большинства основных функций библиотеки времени выполнения, которые принимают аргумент string или char, а не только набор функций strxxx().

Так что ваш пример может сводиться к:

TCHAR *str = _T("Hello"); 
TCHAR* str2 = new TCHAR[23]; // let us say this is big enough 
_tcscpy(str2, str); 
+0

Спасибо @Michael, можно ли впоследствии удалить str2? – Samer

+2

@Samer: '_tcscpy()' это просто 'strcpy()' или 'wcscpy()' в зависимости от того, что такое 'TCHAR'. Таким образом, он оказывает такое же влияние на управление жизненным циклом объекта, что и эти функции (то есть: никакого эффекта). –