繁体   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