[英]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::strstream
, std::istrstream
和std::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.