将字符数组传递给使用构造函数初始化的类构造函数时,防止溢出?

时间:2016-05-06 23:39:58

标签: c++ class initialization

在C ++中,当你在实例化一个类时传递一个char数组时,是否有可能对复制的字节设置上限,以防止在你不确定进入的字符数时出现溢出?

我的实施不是基于用户输入所以我知道它会没事,但我想知道一般知识。

e.g。 (来自this post

class test2 {
    char name[40];
public:
    test2() : name("Standard") {};
    void display() { cout << name << endl; }
};

e.g。 (编辑版this post

class test2 {
    char name[40];
public:
    test2(const char *charsComingIn) : name(charsComingIn) {};
    void display() { cout << name << endl; }
};

作为一个旁注,我没有测试过第二个例子,但那是我此刻想要做的事情的要点。任何更正都欢迎实施的概念。

1 个答案:

答案 0 :(得分:1)

您可以使用strncpy并可能截断:

test2(const char *charsComingIn) {
    strncpy(name, charsComingIn, sizeof(name));
    name[sizeof(name)-1] = '\0';
} 

这肯定不会溢出。但是,用户不知道您是否被截断。如果后者是一个问题,您可能想要抛出异常。

或者你只能允许足够小的数组:

template <size_t N, class = std::enable_if_t<(N <= 40)>>
test2(const char (&in)[N]) {
    memcpy(name, in, N);
} 

哪个不允许任意c字符串。