微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决std::array<char, size> null 是否终止?

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

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

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

解决方法

std::array 是否以 null 结尾?

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。