在C ++中用sscanf分配

时间:2018-11-03 12:31:35

标签: c++ scanf

有人指出,如果存在的话,我的代码中的错误导致此问题使我花了很多时间来解决这个问题,这对C ++编程来说真的很新。 因此bool valid_str会检查字符串是否有效,因此有效的日期格式为ex: 2016-07-08 / 01:00 无效 2016-7-8 / 01:00
在带有字符串的Date构造函数中,如果格式无效,然后将其分配为全0。如果有效,然后将其分配给变量,则这只是一段大代码,但我自己的想法是我搞砸了{{1 }},因此会出现运行时错误(使用Linux的情况)。我使用的正确吗?

sscanf

(已编辑)完整代码:

bool valid_str(const std::string& str)
{
    int len = str.size();
    if (len != 16)
        return false;
    if (str[4] != '-')
        return false;
    if (str[7] != '-')
        return false;
    if (str[10] != '/')
        return false;
    if (str[13] != ':')
        return false;

    for (int i = 0; i < 4; i++) {
        if (str[i] < '0' || str[i] > '9')
            return false;
    }

    for (int i = 5; i < 7; i++) {
        if (str[i] < '0' || str[i] > '9')
            return false;
    }

    for (int i = 8; i < 10; i++) {
        if (str[i] < '0' || str[i] > '9')
            return false;
    }

    for (int i = 11; i < 13; i++) {
        if (str[i] < '0' || str[i] > '9')
            return false;
    }

    for (int i = 14; i < 16; i++) {
        if (str[i] < '0' || str[i] > '9')
            return false;
    }

    return true;
}

//Date Constructor

Date::Date(const std::string& dateString)
{
    std::string str;
    if (valid_str(dateString) == false) {
        this->m_year = 0;
        this->m_month = 0;
        this->m_day = 0;
        this->m_hour = 0;
        this->m_minute = 0;
    }
    else {
        sscanf(dateString.c_str(), "%4d-%2d-%2d/%2d:%2d",
            &m_year,
            &m_month,
            &m_day,
            &m_hour,
            &m_minute);
    }
}  

1 个答案:

答案 0 :(得分:0)

仅作为参考,它可以在Windows 10上使用 MS编译器版本19.15.26732.1 x64

uint32_t m_year = 0;
uint32_t m_month = 0;
uint32_t m_day = 0;
uint32_t m_hour = 0;
uint32_t m_minute = 0;

constexpr char datestring[] = "2016-07-08/01:00";
constexpr char invalid[] = "2016-7-8/01:00";
constexpr char format[] = "%4u-%2u-%2u/%2u:%2u";

void getdate(const char date[])
{
    int32_t result = sscanf(date, format, 
        &m_year,
        &m_month,
        &m_day,
        &m_hour,
        &m_minute);

    _ASSERT(result == 5);
    _ASSERT(m_year == 2016);
    _ASSERT(m_month == 7);
    _ASSERT(m_day == 8);
    _ASSERT(m_hour == 1);
    _ASSERT(m_minute == 0);
}

int wmain()
{
    getdate(datestring);
    getdate(invalid);

    std::string_view sw{datestring};
    getdate(sw.data());
    std::string str{datestring};
    getdate(str.c_str());
}