繁体   English   中英

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

[英]Does the output manipulator std::ends add a Null-character to the output buffer?

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

据说操纵器std::ends将Null字符\\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

  • 在第二行中,可以确定输出看起来像第一行,但是强制刷新缓冲区。

  • 对我来说重要的是使用std::ends ; 据说该操纵器在输出缓冲区中插入了一个Null-Character,但是输出与上面的行相同; 哪个打印出不可读的结尾字符,我猜std::ends没有在输出缓冲区中插入\\0

这是输出:

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

谢谢。

std::ends是一种古老的操纵器,旨在用于现已不推荐使用的阵列I / O流,例如std::strstreamstd::istrstreamstd::ostrstream 如果需要,您将很少在实践中使用它。

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

添加<< std::ends不会使字符数组终止为空,这是在执行第一个表达式之后执行的单独操作。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM