2010-05-11 167 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"); 

對不起,但我無法真正解釋它爲什麼有效,現在沒有時間搜索它。後來!