std::array<char, size> null 是否终止?

时间:2021-07-20 19:07:14

标签: c++ arrays string pointers char

以下代码片段安全吗?它调用了 std::string 的第四个构造函数,该构造函数接受一个指向空终止字符串的指针。问题是,我不确定下面的 word 是否以空值终止。是吗?

std::array<char, 4> word{'a', 'b', 'c', 'd'};

int main()
{
    std::string p = word.data();
    return 0;
}

4 个答案:

答案 0 :(得分:8)

<块引用>

std::array 是否以 null 结尾?

它可以包含一个以空字符结尾的字符串。它不一定包含空终止字符串。

<块引用>
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')};

如果没有空终止符,它将初始化到第一个空终止符或数组的末尾。