C++ 打印时的不同结果'\0';在不同的电脑上?

C++ 打印时的不同结果'\0';在不同的电脑上?,c++,null-terminated,C++,Null Terminated,对于以下代码,在我的电脑上,char\0将始终产生一个空格(使用cout打印时)。但是,在我朋友的电脑上,char\0的结果总是会产生chara。代码和屏幕截图如下所示: #include <iostream> using namespace std; // Function main int main() { cout << "xxx" << '\0' << "yyy" << endl; return 0; } #

对于以下代码,在我的电脑上,char
\0
将始终产生一个空格(使用
cout
打印时)。但是,在我朋友的电脑上,char
\0
的结果总是会产生char
a
。代码和屏幕截图如下所示:

#include <iostream>
using namespace std;

// Function main
int main()
{
    cout << "xxx" << '\0' << "yyy" << endl;
    return 0;
}
#包括
使用名称空间std;
//主要功能
int main()
{

cout字符
\0
或ASCII
0
不是可打印字符,没有标准的输出方式


可打印的ASCII范围从
0x20
0x7E
,请参见
'\0'
是一个终止字符,以了解字符串的结束位置,例如,这将打印
ab

#include <iostream>

int main(int argc, char* argv[])
{
    char str[]= { 'a', 'b', '\0' };
    std::cout <<str<< std::endl;
    return 0;
}
#包括
int main(int argc,char*argv[])
{
字符str[]={a',b','\0'};
std::cout
#include
使用名称空间std;
int main()
{

cout如上所述,它是实现定义的。在我的终端上,我得到一个
^@
NULL
终止符用于打印字符串,但在这种情况下,您试图输出字符本身(它将有各种表示形式,从随机字符到无)。

用于“不可打印字符”(对于ASCII,它是0x20-0x7e[*]范围之外的任何内容),输出在技术上是未定义的,实际的视觉输出将取决于以下几点:

  • 实际的输出设备-如果您在Windows命令行提示符下查看字符,它很可能与Linux下的终端窗口不同,并且使用正版(30年以上)VT100终端,它很可能会再次不同。(事实上,当我第一次为使用串行输入的终端编写代码时,我们使用“pad”某些带有NUL字符的控制序列,因为当转义序列“复杂”时,终端会删除一些字符(例如,在一个清晰的屏幕上,它可能不会接收接下来的5-6个字符,因此我们会额外添加10个NUL字符,这样我们就会丢失NUL字符,而不是希望在屏幕上打印的有意义文本的一部分)

  • 如果适用,选择用于显示文本的字体可能也很重要(在这种特殊情况下似乎是这样,但不要依赖它)。当然,这也适用于可打印字符,但除了一些“特殊”字体(Zapf Dingbats,符号是明显的例子)之外,“可打印范围”确实符合我们的预期“不可打印”范围的定义不太明确

  • 实际打印方法-例如使用
    cout
    printf
    将产生不同于“将字符插入PC上的帧缓冲存储器[文本模式]”的结果

  • 要获得打印不可打印字符的一致结果,您需要将它们处理为定义为可打印的内容


    [*]许多系统支持扩展范围,例如,原始IBM/PC的范围为0x20-0xff,而现代系统使用多个字节来表示UTF-8编码中“不可打印”的字符,其中常用字符[在欧洲语言中]使用单字节编码,不太常见的字符使用两字节、三字节或四字节编码。即使在这里,实际输出也取决于所选的确切字体。

    发布代码。你不应该得到一个字符。.我认为你应该提及不同的编译器,而不是不同的PC。.这似乎很难相信。发布当你在朋友的计算机上运行时,完整的代码以及输出的屏幕截图?@herohuyongtao dbasic询问你是否运行相同的可执行文件,即在一个环境中编译一次,然后在两个不同的环境中运行,而不是在两个环境中编译相同的代码。在我看来,字体大小不同nt-它是否也可能是不同的实际字体?特定字体的“外观”(可打印或不可打印)取决于实际使用的字体。所以打印它是未定义的行为?但为什么我总是会得到一个空格?@VusP我认为这不是未定义的行为,而是实现定义的行为。@herohuyongtao@YuHao:不,实现定义的行为意味着每个实现都需要记录它所做的事情。不需要记录打印空字符的效果。不,这不是因为
    endl
    。即使OP打印的是NUL char,而不是字符串,我也会得到一个空格。你的代码和讨论根本不相关。好吧,但请解释一下为什么在给定的PC上总是一样的?@herohuyongtao为什么输出不同?我的意思是,既然它是随机的,为什么在给定的PC上总是一样?@herohuyongtao它不是随机的,它是实现定义的。我的意思是随机的,因为它会有所不同。@herohuyongtao随机的意思是在给定的实现上它可以是任何东西,而不是随机的,因为它是在每个输出上随机生成的。
    #include < iostream >
    using namespace std;
    int main()
    {
        cout << "xxx" << '\0' << "yyy" << endl;
        return 0;
    }