首页 > 解决方案 > 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()案例创建一个替代方案。有没有办法做到这一点?

标签: c++stringcastingscanfwstring

解决方案


把错误放在你的代码中(比如 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 没有)。但是,这有效的(如果非常规)代码。


推荐阅读