С++ Объединить 2 символа

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

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

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


person backspace    schedule 05.02.2014    source источник
comment
std::string или std::wstring? Или сделать свой собственный tstring, используя std::basic_string<TCHAR>?   -  person Some programmer dude    schedule 05.02.2014


Ответы (3)


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

Если вы находитесь на компьютере с 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);

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

person Eric Fortin    schedule 05.02.2014
comment
@JoachimPileborg Вы правы и, вероятно, лучше в этом конкретном случае. Спасибо за предложение. Отредактировал ответ, чтобы добавить его. - person Eric Fortin; 05.02.2014

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

person Frerich Raabe    schedule 05.02.2014

#include <tchar.h>

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

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

MSDN: _tcscat_s

person Sebastian Ax    schedule 02.11.2018