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? Спасибо

3 ответа

Посмотрите на 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);

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

Чтобы ответить на вопрос в заголовке: вы объединяете два 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".

#include <tchar.h>

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

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

MSDN: _tcscat_s

Другие вопросы по тегам