在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; }
};
作为一个旁注,我没有测试过第二个例子,但那是我此刻想要做的事情的要点。任何更正都欢迎实施的概念。
答案 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字符串。