3

对于以下代码,在我的 PC 上,char\0总是会产生一个空格(使用 打印时cout)。但是,在我朋友的 PC 上, char 的结果\0总是会导致 char a。代码和截图如下:

#include <iostream>
using namespace std;

// Function main
int main()
{
    cout << "xxx" << '\0' << "yyy" << endl;
    return 0;
}

在此处输入图像描述 在此处输入图像描述

:在我的电脑上。 :在我朋友的电脑上。

这里发生了什么?为什么不同PC上的结果不同?

PS

  1. exe即使我们共享相同的可执行文件(即在我的 PC 上编译并在两台 PC 上运行),结果仍然会有所不同。

  2. 我们都使用具有相同项目字符集的 Visual Studio 2010。

  3. 这里可能有一些缓冲区溢出,但请注意我总是会得到一段space时间,我的朋友总是会得到一个 char a

  4. 如果我们都这样做,它具有相同的功能cout<<ends

4

5 回答 5

6

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

可打印的 ASCII 范围从0x200x7E,参见Wikipedia:ASCII

于 2014-01-01T08:56:04.583 回答
2

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

  1. 实际的输出设备 - 如果您在 Windows 命令行提示符下查看该字符,它可能看起来与 Linux 下的终端窗口不同,而使用正版(30 岁以上)VT100 终端,它很可能会再次看起来不同。(事实上​​,当我第一次为使用串行输入的终端编写代码时,我们曾经用 NUL 字符“填充”某些控制序列,因为当转义序列“复杂”时终端会丢弃一些字符 - 说清楚-screen,它可能不会接收接下来的 5-6 个字符,所以我们会添加额外的 10 个 NUL 字符,这样我们就会丢失 NUL 而不是我们想要在屏幕上打印的有意义文本的一部分)。

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

  3. 实际打印的方法 - 例如,使用coutprintf将产生与“将字符插入 PC [in text mode] 上的帧缓冲存储器”不同的结果。

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

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

于 2014-01-01T12:07:54.650 回答
1

如前所述,它是实现定义的。在我的终端上,我得到一个^@. 终止符用于打印字符串,但在这种NULL情况下,您尝试输出字符本身(并且它将具有不同的表示形式,从随机字符到什么都没有。)

于 2014-01-01T09:17:09.637 回答
0

'\0'是一个终止字符,用于知道字符串在哪里结束,例如这将打印ab

#include <iostream>

int main(int argc, char* argv[])
{
    char str[]= { 'a', 'b', '\0' };
    std::cout <<str<< std::endl;
    return 0;
}

如果您只打印最后一个字符,它不应该打印任何内容,而是立即终止而不打印任何内容。

您所说的空间可能是由std::endl

这里没有未定义的行为,未定义的行为通常是在相反的情况下引起的,没有终止 char( '\0'),然后打印超出分配块的内存,然后打印的内容是未定义的。

编辑:

这真的很奇怪,你说的没有意义,请发布你所有的代码

于 2014-01-01T09:00:12.737 回答
0
#include < iostream >
using namespace std;
int main()
{
    cout << "xxx" << '\0' << "yyy" << endl;
    return 0;
}

我不知道你为什么会得到不同的 o/p 。用 g++ 检查一次。我用 g++ 得到了这个 o/p

在此处输入图像描述

于 2014-01-01T09:15:12.003 回答