如何将TCHAR与char数组拼接?GetCurrentDirectory使用问题
解决TCHAR路径与字符串拼接的问题
嘿,这个TCHAR和char的拼接坑我之前也踩过!其实核心问题就是GetCurrentDirectory返回的是TCHAR类型(在Unicode编译模式下是wchar_t,多字节模式是char),而你要拼接的"\\filename.so"是char字面量,类型不匹配导致没法直接操作。下面给你几个简单靠谱的解决方案:
方案1:用TCHAR通用宏函数(兼容两种编译模式)
直接用Windows提供的TCHAR系列宏,把字符串字面量转成对应类型,再用通用的字符串拼接函数,这样不管是Unicode还是多字节编译都能正常工作:
#include <tchar.h> #include <windows.h> #include <iostream> int main() { TCHAR pwd[MAX_PATH]; GetCurrentDirectory(MAX_PATH, pwd); // 用_tcscat拼接,注意要确保pwd数组有足够剩余空间,或者用更安全的_tcsncat _tcscat(pwd, _T("\\filename.so")); MessageBox(NULL, pwd, pwd, 0); std::wcout << pwd << '\n'; return 0; }
_T("字符串")会自动根据编译模式把字符串转成TCHAR类型(Unicode下是宽字符串,多字节下是普通char字符串)_tcscat是通用的字符串拼接函数,对应Unicode模式的wcscat,多字节模式的strcat
方案2:直接用宽字符串(推荐,现代Windows默认Unicode)
现在Windows程序基本都是Unicode编译模式,直接用宽字符版本的函数和std::wstring来处理,既简单又安全,还能避免数组溢出的问题:
#include <windows.h> #include <iostream> #include <string> int main() { wchar_t pwd[MAX_PATH]; // 直接调用宽字符版本的GetCurrentDirectoryW GetCurrentDirectoryW(MAX_PATH, pwd); // 用std::wstring来拼接,自动处理内存扩容 std::wstring fullPath(pwd); fullPath += L"\\filename.so"; // 宽字符串字面量要加L前缀 MessageBoxW(NULL, fullPath.c_str(), fullPath.c_str(), 0); std::wcout << fullPath << '\n'; return 0; }
这种方式不需要纠结TCHAR的宏,逻辑更清晰,而且std::wstring会自动管理内存,比固定大小的数组更安全。
方案3:转成多字节字符串(仅当需要和char代码交互时用)
如果你的代码里必须和char类型的字符串交互,可以把宽字符串转成多字节字符串(注意编码问题,推荐用UTF-8):
#include <windows.h> #include <iostream> #include <string> #include <cstdlib> int main() { wchar_t pwd[MAX_PATH]; GetCurrentDirectoryW(MAX_PATH, pwd); // 计算转换需要的缓冲区大小 int bufferSize = WideCharToMultiByte(CP_UTF8, 0, pwd, -1, NULL, 0, NULL, NULL); char* charPath = new char[bufferSize]; // 把宽字符串转成UTF-8编码的多字节字符串 WideCharToMultiByte(CP_UTF8, 0, pwd, -1, charPath, bufferSize, NULL, NULL); std::string fullPath(charPath); fullPath += "\\filename.so"; MessageBoxA(NULL, fullPath.c_str(), fullPath.c_str(), 0); std::cout << fullPath << '\n'; delete[] charPath; // 记得释放内存 return 0; }
不过这种方式不推荐作为首选,因为转码过程容易出现编码错误,而且Windows原生更推荐用宽字符处理路径。
总的来说,方案2是最省心的,适合现代Windows程序开发~
内容的提问来源于stack exchange,提问作者user8539043
相关产品推荐
相关产品推荐

