2010-05-11 81 views
6

我很确定这是一个愚蠢的问题,但它让我发疯。print TCHAR []在控制台上

我怎么能在控制台上打印一个TCHAR数组?

DWORD error = WSAGetLastError(); 
TCHAR errmsg[512]; 
int ret = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, error, 0, errmsg, 511, NULL); 

我需要打印ERRMSG ...

+0

即使您的程序正确地将UTF16写入控制台,请注意,Windows控制台不是UTF16友好的,可能只是显示垃圾。请参阅此问题的解决方法:http://stackoverflow.com/q/10764920/845092 – 2014-12-16 21:59:05

回答

10

这取决于TCHAR是什么。如果您启用Unicode编译,TCHAR被定义为wchar_t。然后你可以使用std::wcout,例如:

std::wcout << L"Error: " << errmsg << '\n'; 

如果不支持Unicode,TCHAR是一个普通的char,您可以使用普通的std::cout

std::cout << "Error: " << errmsg << '\n'; 
+0

非常感谢:)! – hara 2010-05-11 17:13:39

+6

即使使用TCHAR,如果要让程序依赖于它是char或者wchar_t,那又有什么意义呢?无论你使用的是什么字符集,它的全部工作就是工作,对吧? – Strigoides 2014-02-23 22:28:55

+0

@Strigoides:假设'TCHAR' =='wchar_t'很常见。几乎没有人使用'TCHAR' =='char'。我同意这是毫无意义的,但我认为它是一种常态,对于那些仍在使用MFC的人来说尤其如此。 – 2014-12-16 21:57:35

2
#include <tchar.h> /* _tprintf */ 

DWORD dwError; 
BOOL fOk; 
HLOCAL hlocal = NULL; // Buffer that gets the error message string 

fOk = FormatMessage(
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS | 
    FORMAT_MESSAGE_ALLOCATE_BUFFER, 
    NULL, dwError, 0, (PTSTR) &hlocal, 0, NULL); 
if (! fOk) hlocal = TEXT("Fehler FormatMessage"); 
_tprintf(TEXT("%d\t%s\n"), dwError, hlocal); 
if (fOk) LocalFree(hlocal); 
-2

我真的不知道为什么,但此代码为我工作:

TCHAR NPath[MAX_PATH]; 
    DWORD a = GetCurrentDirectory(MAX_PATH, NPath); 
    string b = ""; 
    for(int i=0; i<a;i++){ 
     b+=NPath[i]; 
    } 
    cout << b; 
    system("pause"); 

对不起,但我无法真正解释它为什么有效,现在没有时间搜索它。后来!