C ++ Combine 2 Tchar

Я пытаюсь объединить 2 тчар.

char username[UNLEN+1];
DWORD username_len = UNLEN+1;
GetUserName(username, &username_len);
TCHAR* appdatapath ="C:\\Users\\"+username+"\\AppData";

Но я получаю сообщение об ошибке в строке appdatapath. Как я могу комбинировать 2 tchar? Спасибо

5

Решение

Посмотри на strcat а также wcscat. Вы не можете добавить указатель на символ с массивом символов.

Если вы находитесь на машине с Windows, вы можете использовать _tcscat который перенаправит на нужную функцию для использования в зависимости от _UNICODE а также _MBCS определяет.

Возможно, вы захотите использовать безопасные версии, добавив _s к имени функции.

Как указано в комментариях, вы также можете использовать snprintf следующим образом:

const size_t concatenated_size = 256;
char concatenated[concatenated_size];

snprintf(concatenated, concatenated_size, "C:\\Users\\%s\\AppData", username);

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

4

Другие решения

Чтобы ответить на вопрос в заголовке: вы объединяете два TCHAR строки с использованием _tcscat функция.

Однако в вашем коде есть другие проблемы, связанные с этим: GetUserName ожидает LPTSTRто есть указатель на буфер TCHAR персонажи. Кроме того, есть еще один TCHAR использование в

TCHAR* appdatapath ="C:\\Users\\"+username+"\\AppData";

Проблема в том, что тип, к которому TCHAR расширяет изменения в зависимости от того, _UNICODE определено. В частности, если вы установите его, TCHAR (в конце концов) расширяется до wchar и поэтому GetUserName ожидает wchar_t* но вы передаете char*, Другая проблема заключается в том, что вы не можете объединять массивы C, используя + оператор.

Предлагаю перестать беспокоиться о TCHAR во-первых, и всегда просто компилировать с _UNICODE определены — и использовать wchar по всему вашему коду. Кроме того, поскольку вы используете C ++, просто используйте std::wstring:

wchar username[UNLEN+1];
DWORD username_len = UNLEN+1;
GetUserNameW(username, &username_len);
std::wstring appdatapath = L"C:\\Users\\";
appdatapath += username;
appdatapath += L"\\AppData";

И последнее, но не менее важное: весь ваш код, вероятно, можно заменить вызовом SHGetSpecialFolderPath функция — пройти CSIDL_APPDATA к нему, чтобы получить путь «AppData».

3

#include <tchar.h>

const size_t stringSize= 20;
TCHAR value[stringSize] = { 0 };

_tcscat_s(value, stringSize, TEXT("appendMe"));

MSDN: _tcscat_s

0
По вопросам рекламы [email protected]