特定长度的 C++ 字符串

Posted

技术标签:

【中文标题】特定长度的 C++ 字符串【英文标题】:C++ string of a specific length 【发布时间】:2011-04-06 20:30:07 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

如果异常感觉太“永久”,您可以使用一个可以在稍后关闭的断言。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

我会做如下的事情

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];
;

【讨论】:

@Donotalo,什么都没有。 OP 说只需要 13 个 char 值,所以我不想浪费 string 的额外开销。

以上是关于特定长度的 C++ 字符串的主要内容,如果未能解决你的问题,请参考以下文章

华为机试真题 C++ 实现停车场车辆统计

C++ - 字符串容量模式

c ++如何删除特定字符串中的空格

C++基础求教,如何限制字符串长度

c++如何获取字节BYTE的长度?

输入到特定长度的填充文本添加空格