ASCII值= 0和'\ 0'

iam*_*wen 4 c ascii null-character

我看过这篇文章.但当我尝试时:

  printf("before null %c after null\n", 0);  // (ASCII=0) != '\0' ??
Run Code Online (Sandbox Code Playgroud)

而不是得到:

before null 
Run Code Online (Sandbox Code Playgroud)

我有:

before null   after null
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:ASCII值0实际上是否等于'\ 0'?

Att*_*tie 5

ASCII值0实际上等于\0


字符串如何存储在内存中以及由类似函数处理的差异printf()很重要.

"before null %c after null\n"
"before null \0 after null\n"
Run Code Online (Sandbox Code Playgroud)

两者都存储在内存\0中,末尾有一个隐式终结符.第二个\0在中间具有明确特征的事实改变了事物.

printf()将扫描字符串直到" 结束 ",打印组件,因为它在C中" 结束 "通常意味着直到第一个\0/ 字符.

使用第一个变体,将printf()字符复制到输出,直到它到达%c指令,此时它会查看给予函数的参数...它可能会发现您给出的'\0',或者它可能会发现您给出的'+'- 无论哪种方式,它将其复制到输出.然后它会继续将字符复制到输出中,寻找字符串的" 结束 ".

使用第二个变体,printf()将开始将字符复制到输出,将找到" 结束 "(由表示\0),并停止.

如果您要使用snprintf(),那么结果/输出将包含以下内容:(同样,隐式\0终止)

"before null \0 after null\n"
"before null "
Run Code Online (Sandbox Code Playgroud)

如果您随后打印这两个,它们看起来会一样,但内存内容会有所不同.

然而,输出printf()是终端(或文件)...发生的情况\0取决于您的终端仿真器...它可能根本不显示,它可能显示为空格,或者它可能有一个有趣的框符号...

需要注意的重要一点是,这发生在运行时 - 而不是编译时.