gpt4 book ai didi

c++ - 输出操纵器 std::ends 是否将 Null 字符添加到输出缓冲区?

转载 作者:行者123 更新时间:2023-11-27 23:38:52 24 4
gpt4 key购买 nike

再次阅读 C++ primer 5ed 我有一个简单的问题:

据说操纵器 std::ends 将空字符 \0 插入到输出缓冲区,然后将其刷新。

所以我试着通过一个例子来理解它:

#include <iostream>


int main() {

char sz[]{ 'H', 'e', 'l', 'l', 'o', '!' }; // no null-terminator character ('\0')
std::cout << sz; // Hello!
std::cout << sz << std::flush;
std::cout << sz << std::ends;

}

在上面的第一行输出中,我在字符数组中附加了一些不可读的字符;好的,因为我没有向 sz 添加空字符 \0

  • 在第二行中,输出看起来与第一行相同,但强制刷新缓冲区。

  • 第三行 using std::ends 对我来说很重要;据说这个操纵器将一个 Null-Character 插入到输出缓冲区,但输出与上面的行相同;哪个打印出不可读的尾随字符,我猜 std::ends 没有在输出缓冲区中插入 \0?!

这是输出:

Hello!╠╠╠╠╠╠ظش↕♠L·6
Hello!╠╠╠╠╠╠ظش↕♠L·6Hello!╠╠╠╠╠╠ظش↕♠L·6

谢谢。

最佳答案

std::ends是一个古老的操纵器,旨在用于现在已弃用的数组 I/O 流,如 std::strstream , std::istrstream , 和 std::ostrstream .你很少会在实践中使用它。

您的代码中的问题是 std::cout << sz << std::ends首先执行 std::cout << sz这将打印字符数组。字符数组上的提取器重载旨在继续打印每个字符,直到找到空终止符。 sz不以 1 结尾,因此提取器将继续迭代数组的末尾,直到它在周围内存中遇到随机空字符。由此产生的结果称为未定义行为。编译器不再需要符合您的代码逻辑,因此输出可能是无意义的垃圾,或者它可以以代码正常工作的方式打印出来。未定义的行为意味着未定义。

添加<< std::ends不会以 null 终止字符数组,它是一个单独的操作,第一个表达式执行后执行。

如果您想按原样打印字符数组,我建议您使用 write :

std::cout.write(sz, sizeof(sz));

关于c++ - 输出操纵器 std::ends 是否将 Null 字符添加到输出缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57172957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com