我正在尝试使用win32 api(使用GetCurrentDirectory
)作为char
数组获取当前目录...
但以下代码打印:004FF56C
TCHAR NPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH, NPath);
std::cout << NPath << endl;
此代码有什么问题?
答案 0 :(得分:4)
问题是默认情况下,Visual Studio项目将UNICODE用于所有Win32 API函数。这意味着TCHAR
映射到wchar_t
而不是char
,因此所有基于TCHAR
的字符串都被视为wchar_t[]
而不是char[]
。< / p>
一个解决方案是使用std::wcout
输出Unicode字符串。
您可以将项目设置更改为默认情况下不使用Unicode,方法是转到Project Properties
- &gt; General
- &gt; Character set
并将其更改为未设置。这告诉编译器将TCHAR
映射到char
而不是wchar_t
。
您可以使用WideCharToMultiByte()
或std::wcstombs()
将Unicode字符串从wchar_t[]
转换为char[]
。
您可以直接致电GetCurrentDirectoryA()
。
char NPath[MAX_PATH];
GetCurrentDirectoryA(MAX_PATH, NPath);
std::cout << NPath << endl;
现在回到为什么你得到004FF56C
或其他随机数,如果你看一下docs你看到这个运算符,它与std::cout
的实现有关:
template< class CharT, class Traits >
basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os,
const CharT* s );
CharT
char
为std::cout
,wchar_t
为std::wcout
。如果您使用不匹配的char/wchar_t
和cout/wcout
,则会调用another operator(打印指针值的那个),而不是打印文本的那个:
basic_ostream& operator<<( const void* value );