我正在處理VS 2010中的C++項目。我想要獲取DESKTOP的路徑,我已經編寫了一些教程中給出的以下代碼。獲取C++中的系統文件夾
TCHAR path[MAX_PATH];
SHGetSpecialFolderPath(0,path,CSIDL_DESKTOP,FALSE);
printf("Path : %s",path);
但上面的代碼只是印刷
路徑:C
麻煩改正在上面的代碼
我正在處理VS 2010中的C++項目。我想要獲取DESKTOP的路徑,我已經編寫了一些教程中給出的以下代碼。獲取C++中的系統文件夾
TCHAR path[MAX_PATH];
SHGetSpecialFolderPath(0,path,CSIDL_DESKTOP,FALSE);
printf("Path : %s",path);
但上面的代碼只是印刷
路徑:C
麻煩改正在上面的代碼
使用_tprintf
http://msdn.microsoft.com/en-us/library/wc7014hz.aspx
當一個TCHAR字符串被傳遞給一個窄字符串函數(如printf
)時,數據將被逐字節讀取,並且當它到達第一個空字符('\ 0')時,它將是解釋爲字符串的結尾。這就是爲什麼它只打印TCHAR字符串的第一個字符。
_tprintf
一次只能看到一個TCHAR
,所以它會一直看,直到它遇到一個零的TCHAR。
我認爲你的項目在設置中有一個字符集'Unicode'。 在這種情況下,TCHAR被視爲wchar_t,而SHGetSpecialFolderPath被定義爲SHGetSpecialFolderPathW,因此,您獲得的'DESKTOP'路徑是Unicode編碼,因此您有兩個選擇來解決此問題。
也就是說,您可以用相反的'S'或's'打印相反的char(char/wchar_t)。 我很高興可能是我可以幫你! 哦,我忘了解釋輸出。 在你的代碼中,path是wchar_t,但'%s'是小寫's',你的路徑被'printf'當作char來對待。
的wchar_t的數據(16位)在你的路徑是這樣的:
{L'C 'L '\',L'W',L'I 'L'N',L'd ',L''',L''',L's',L''',.../即 /}
而char數據(也稱爲字節數據,8位)是這樣的: {'C','\ 0','\','\ 0','W','\ 0','i','\ 0',.../即 /}
它看起來像s因爲「\ Windows .../** /」位於'null-terminal'標記'\ 0'後面,因此被忽略。
這解釋了爲什麼它只輸出'C' - 路徑是一個寬字符,第二個字節是0;從而儘早終止字符串。 – seand