特定长度的C ++字符串

时间:2011-04-06 20:30:08

标签: c++ typedef

我正在尝试编写一个具有“序列号”概念的函数。它有一个特定的长度。我希望通过创建一个名为SerialNumber的新类型来简化构造函数,该类型包含这个13字节数字的概念。例如,我不希望产品(const char * m)或Product(const std :: string& str)截断该值并且是反直觉的。它更喜欢Product(const SerialNumber& sn),我总是可以指望它是正确的长度。最好的方法是什么?它应该是char [13]的typedef还是有一种方法可以用字符串类来完成?

4 个答案:

答案 0 :(得分:4)

最简单的方法是创建一个接受std :: string的构造函数,然后在构造函数中验证长度确实为13.如果不是,只需抛出异常 - 这就是它们存在的原因。请记住,char [13]不能保证字符串长度为13个字符,毕竟它可以是“hi”,然后是11个空终止符。

答案 1 :(得分:1)

我不确定你的情况,但是一个选择仍然是使用std :: string但是例如Product的构造函数会在字符串长度错误时抛出。否则,最简单的方法似乎是SerialNumber(或std::string的包装char[14]类,但我对在C ++代码中使用C字符串犹豫不决。

答案 2 :(得分:0)

我会使用typedef char [13]或围绕char [13]的包装类。由于chars表与char *相同,如果需要,您可以轻松地将其转换为std :: string。

答案 3 :(得分:0)

我会做类似以下的事情

struct SerialNumber {
    static bool TryCreate(const std::string& data, std::auto_ptr<SerialNumber>& ptr) {
        if (data.length() != 13) {
            ptr.reset();
            return false;
        } else {
            ptr.reset(new SerialNumber(data.c_str()));
            return true;
        }
    }

private:
    SerialNumber(const char* data) {
        memcpy(m_data, data, sizeof(data));
    }

    char m_data[13];
};
相关问题