2017-07-26 52 views
0

我讀從通過控制檯用戶的文件目錄,我必須存儲在一個pxcCHAR*變量的值,這是SDK的typedefwchar_t*轉換的std :: string到wchar_t的的一個typedef *

我發現我可以通過以下操作完成從std::stringstd::wstring的轉換。

#include <iostream> 

int main(){ 
    std::string stringPath; 
    std::getline(std::cin, stringPath); 
    std::wstring wstrPath = std::wstring(stringPath.begin(), stringPath.end()); 
    const wchar_t* wcharPath = wstrPath.c_str(); 
    return 0; 
} 

當我運行這段代碼時,我通過調試看到了這些值。

stringPath= "C:/Users/" 
wstrPath= L"C:/Users/" 
wcharPath= 0x00b20038 L"C:/Users/" 

這個值連接到wcharPath的前面來自哪裏?

此外,

因爲pxcCHAR*wchar_t*一個typedef,我認爲這將是好簡單地做到這一點:

pxcCHAR* mFilePath = wcharPath; 

不過,我得到一個消息,說「常量爲wchar_t *」不能用於初始化「pxcCHAR *」類型的實體。

我希望隱式轉換工作,但事實並非如此。我怎樣才能克服這個錯誤?

+0

[轉換Unicode字符串,反之亦然(https://stackoverflow.com/questions/4786292/converting-unicode-strings-and-vice-versa)的可能的複製 –

+0

在討論「轉換」的字符串之間沒有點類型,而無需指定您在轉換的任何一側使用的編碼。 – MrEricSir

回答

2

使用std::wstring(stringPath.begin(), stringPath.end())是處理字符串轉換的錯誤方法,除非您可以保證您只處理7位ASCII數據(文件系統不是這種情況)。這種類型的轉換根本不考慮字符編碼。將std::string轉換爲std::wstring的正確方法是使用std::wstring_convert,MultiByteToWideChar()或其他等效項。如果你環顧四周,有很多這方面的例子。

更好的是隻用std::wstring開始與代替std::string,如:

#include <iostream> 
#include <string> 

int main(){ 
    std::wstring stringPath; 
    std::getline(std::wcin, stringPath); 
    const wchar_t* wcharPath = stringPath.c_str(); 
    return 0; 
} 

哪裏值鏈接到wcharPath來自的面前?

調試器。它只是顯示指針指向的內存地址,後面跟着該地址的實際字符數據。

我收到一條消息,說「const wchar_t *」不能用於初始化「pxcCHAR *」類型的實體。

這意味着pxcCHAR不是const wchar_t一個typedef,但更可能只是wchar_t一個typedef本身。不管使用何種類型,您都不能指定const指針指向非const指針。如果你需要這種類型的賦值,你必須類型轉換的const了,如用const_cast

pxcCHAR* mFilePath = const_cast<wchar_t*>(wcharPath);