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