簡體   English   中英

如何將uint16_t轉換為寬字符串(std :: wstring)

[英]How to convert uint16_t to a wide string (std::wstring)

我的問題與uint8_t,uint16_t,...的格式說明符有關。

回顧原始問題是關於如何使用uint8_t,uint16_t,uint32_t和uint64_t與scanf的說明符?

問題的答案如下:

sscanf (line, "Value of integer: %" SCNd32 "\n", &my_integer);

但有沒有人知道如何做到這一點,但導致一個寬字符串?

std::wstring line;
swscanf (line.c_str(), L"Value of integer: %" SCNd16 L"\n", &my_integer);

sbove行給了我一個連接錯誤。 我相信因為SCNd16不適合廣泛使用?

目前我的解決方案是在原始答案中創建std :: string,然后將其轉換為寬字符串

sscanf_s(line.c_str(), "%" SCNd16 "\n", &sixteenBitInteger)
// code here to check for EOF and EINVAL
//then I convert it 
typedef std::codecvt_utf8<wchar_t> ConverterType; 
std::wstring_convert<ConverterType, wchar_t> converter;
std::wstring convertedString = converter.from_bytes(line);

但它相當丑陋,我相信必須有更好的方式來進行這種轉換? 如果它有助於理解我的使用,我使用uint16_t類型來存儲Web服務器的端口號,但我希望能夠將它轉換為寬字符串,因為這是預期的顯示類型。 我也在使用C ++ 11,如果它改變了答案,我確實可以訪問boost庫,但我寧願不使用它們。

這是一個VS2013編譯器錯誤 由於它已被關閉為“固定”,它可能在VS2015中工作(沒有安裝預覽試試)。

您擁有的代碼行

swscanf (line.c_str(), L"Value of integer: %" SCNd16 L"\n", &my_integer);

形成良好,因為即使SCNd16擴展為缺少L前綴的字符串文字,標准也表示如果兩個相鄰的字符串文字中缺少一個編碼前綴,則將其視為具有與之前相同的編碼前綴。其他。

§2.14.5/ 14 [lex.string]

在翻譯階段6(2.2)中,相鄰的字符串文字被連接起來。 如果兩個字符串文字具有相同的encoding-prefix ,則生成的連接字符串文字具有該encoding-prefix 如果一個字符串文字沒有編碼前綴 ,則將其視為與另一個操作數相同的編碼前綴的字符串文字。 ...


通常,您可以使用預處理器通過使用標記連接來擴展字符串。 例如,定義一組這樣的宏

#define WIDEN_(x) L##x
#define WIDEN(x) WIDEN_(x)

並將有問題的代碼行轉換為

swscanf (line.c_str(), L"Value of integer: %" WIDEN(SCNd16) L"\n", &my_integer);

將解決問題,但由於實現細節,它不在VS2013上。 SCNd16宏實際上擴展為兩個單獨的字符串文字 - "h" "d" 所以上面的宏擴展了第一個文字,但不是第二個,你遇到了同樣的(假的)錯誤。

您可以選擇對字符串"hd"進行硬編碼,或者使用您顯示的運行時轉換解決方案。

一個純粹的猜測,因為我現在沒有時間嘗試它。

您是否可以使用preprocesser將寬字符串L標記粘貼到擴展SCNd16的前面?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM