以下代码片段安全吗?它调用了 std::string 的第四个构造函数,该构造函数接受一个指向空终止字符串的指针。问题是,我不确定下面的 word
是否以空值终止。是吗?
std::array<char, 4> word{'a', 'b', 'c', 'd'};
int main()
{
std::string p = word.data();
return 0;
}
答案 0 :(得分:8)
std::array
它可以包含一个以空字符结尾的字符串。它不一定包含空终止字符串。
<块引用>std::array<char, 4> word{'a', 'b', 'c', 'd'};
该数组不包含以空字符结尾的字符串。您可以判断,因为没有一个元素是空终止符。
<块引用>std::string p = word.data();
此程序的行为未定义。
<块引用>以下代码片段安全吗?
没有
如何使空字终止。
这是一个例子:
std::array<char, 5> word{'a', 'b', 'c', 'd'};
或者如果你想更明确:
std::array<char, 5> word{'a', 'b', 'c', 'd', '\0'};
答案 1 :(得分:4)
这个数组是非空终止的。使它以空值结尾的一种简单方法是像这样从 string literal
初始化它:
std::array<char, 5> a{"abcd"};
答案 2 :(得分:3)
以下代码片段安全吗?
没有。它正在调用未定义行为。
<块引用>它调用了 std::string 的第四个构造函数,该构造函数接受一个指向空终止字符串的指针。问题是,我不确定下面的 word
是否以空值终止。是吗?
不,不是。
一个简单的解决方法,假设您不想以空值终止数组,将使用不同的 std::string
构造函数,该构造函数接受所需的长度作为参数,例如:
std::array<char, 4> word{'a', 'b', 'c', 'd'};
int main()
{
std::string p(word.data(), word.size());
// more generally:
// std::string p(word.data(), desired_length);
return 0;
}
或者,您可以使用不同的 std::string
构造函数来代替迭代器,例如:
std::array<char, 4> word{'a', 'b', 'c', 'd'};
int main()
{
std::string p(word.begin(), word.end());
// more generally:
// std::string p(word.begin(), word.begin() + desired_length);
return 0;
}
无论哪种方式,您都不需要空终止符。
答案 3 :(得分:2)
如果您的目标是使用 std::array 中的 空终止字符串 初始化 std::string
但不超过边界,您可以使用std::find
像这样:
std::string p{std::begin(word), std::find(std::begin(word), std::end(word), '\0')};
如果没有空终止符,它将初始化到第一个空终止符或数组的末尾。