c++ - swscanf 在铸造中的实现
问题描述
我正在做一个项目,我需要用它swscanf()
来确定字符串值是十进制还是十六进制。之后,我将该值放入变量中。功能是:
Input_String(const std::wstring& a, const StringFormat b)
{
unsigned int Value;
switch (b)
{
case Decimal:
swscanf(string.c_str(), L"%u", &Value);
break;
case HexCode:
swscanf(string.c_str(), L"%x", &Value);
break;
default:
swscanf(string.c_str(), L"%u", &Value);
break;
}
}
StringFormat
是用于格式检查的枚举。
我想为swscanf()
案例创建一个替代方案。有没有办法做到这一点?
解决方案
把错误放在你的代码中(比如 usingstring
代替应该是什么a
,并且你的函数没有声明的类型或返回值)放在一边……如果你只能在十六进制和十进制之间选择,你可以将format
参数初始化为swscanf
根据传递的枚举类型:
#include <iostream>
#include <string>
typedef enum {
Decimal, HexCode
} StringFormat;
unsigned int Input_String(const std::wstring& a, const StringFormat b)
{
unsigned int Value;
const wchar_t* fmt = (b == HexCode) ? L"%x" : L"%u";
if (swscanf(a.c_str(), fmt, &Value) != 1) {
Value = UINT_MAX; // Always check return value and handle any error!
}
return Value;
}
或者,如果您愿意,可以将该三元表达式本身作为参数:
unsigned int Input_String(const std::wstring& a, const StringFormat b)
{
unsigned int Value;
if (swscanf(a.c_str(), (b == HexCode) ? L"%x" : L"%u", &Value) != 1) {
Value = UINT_MAX; // Error condition
}
return Value;
}
请注意,在上述两个代码示例中,一些编译器会抱怨(发出警告)关于不使用字符串文字作为format
参数的swscanf
(MSVC 使用但 clang-cl 没有)。但是,这是有效的(如果非常规)代码。
推荐阅读
- java - 所有数据都需要 SharedPreferences 吗?
- java - Android工作室“hidpi = true”不起作用
- php - 如何在php打印机上设置字体大小12
- azure - 动态创建 Azure Active Directory
- javascript - 如何在生产中获取绝对 URL?
- flutter - Flutter / Dart 组件视觉方案?
- c++ - 将 MySQL 日期时间表示转换为 C++
- python - Django:分页不会在第 1 页居中
- json - 使用 Wrangler 将 Avro 文件转换为云 Datafusion 中的 JSON
- c# - 使用 .NET Core 进行 Google API 客户端库身份验证