2014-02-05 4 views
4

2 tchar을 결합하려고합니다.C++ Combine 2 Tchar

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

그러나 appdatapath 줄에 오류가 발생합니다. 2 tchar을 어떻게 결합 할 수 있습니까? 감사합니다

+1

['std :: string' 또는'std :: wstring'] (http://en.cppreference.com/w/cpp/string/basic_string)? 또는'std :: basic_string '을 사용하여 자신의'tstring'을 만드시겠습니까? –

답변

4

strcatwcscat을 살펴보십시오. 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); 

및 런타임 문자열 후, 그것은 아마도 더 나은 방법입니다 전에 문자열 리터럴을 가지고 있기 때문에.

+0

또는 ['_sntprintf'] (http://msdn.microsoft.com/en-us/library/2ts7cx93.aspx) –

+0

@JoachimPileborg이 특별한 경우에 당신이 옳을 것이며 아마도 더 낫습니다. 제안 해 주셔서 감사합니다. 추가 답변을 수정했습니다. –

3

제목에있는 질문에 대답하려면 _tcscat 함수를 사용하여 두 개의 TCHAR 문자열을 연결하십시오.

그러나 여기에는 코드와 관련하여 GetUserNameLPTSTR, 즉 버퍼에 대한 포인터 TCHAR자를 사용해야합니다. 또한,이와

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

문제의 또 다른 TCHAR 사용이 TCHAR 여부 _UNICODE에 따라 변경 확장되는 타입이 정의되어있다합니다. 특히이를 설정하면 TCHAR (결국)은 wchar으로 확장되므로 wchar_t*을 사용하지만 char*을 전달하면 GetUserName이됩니다. 또 다른 문제는 + 연산자를 사용하여 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"를 얻을 수 통로.