【问题标题】:Null character and strings in CC中的空字符和字符串
【发布时间】:2019-01-30 16:56:32
【问题描述】:

我有以下 C 代码:

#include <stdio.h>
#include <strings.h>

int main(void){

char * str = "\012\0345";

char testArr[8] = {'\0','1','2','\0','3','4','5','\0'};

printf("%s\n",str);

printf("**%s**",testArr);

return 0;
}

查看实时代码here

我无法理解结果,我已经用谷歌搜索了,但我不确定我理解为什么字符串开头的空字符以及为什么中间的空字符只会导致字符串“5”显示。此外,当我将每个字符串字符分配给数组 testArr 然后尝试显示该字符数组时,尽管字符串和数组具有相同的字符,但结果是不同的。所以,我对令人困惑的结果感到震惊,尤其是它们的差异。对于字符串str,代码是否显示“5”是因为空字符覆盖了内存中的内容?

此外,对于我使用相同字符创建的数组,数组 testArr 中包含的数据不会显示任何内容。是否因为某种原因遇到第一个 null 时,其他所有内容都会被忽略?如果是这样,为什么包含相同字符的字符串 str 不会发生相同的行为?

【问题讨论】:

  • C 中的八进制数最多为 3 位。基本上你应该得到八进制字符表示。
  • @RaymondChen,四个,不是三个。
  • 如果您将str 更改为"\0zz\0345",现在解析器会将第一个\0 视为空值,因为z 不是有效的八进制字符,因此您将得到相同的结果testArr 的输出不足。

标签: c


【解决方案1】:

八进制转义序列是\,后跟一到三个八进制数字,根据 C 2018 6.4.4.4 1。根据 6.4.4.4 7:“每个八进制或十六进制转义序列是可以构成转义序列。”因此,当编译器看到"\012\0345" 时,它会将其解释为序列\012(即十)、序列\034(即二十八)和字符5

要表示您想要的字符串,您可以使用"\00012\000345"。由于八进制转义序列在三位数字处停止,这被解释为序列\000、字符12、序列\000,以及字符34 和@987654333 @。 (也会自动附加一个空终止字符。)

当您打印 "\012\0345" 时,代码 10 和 28 的字符已打印但没有可见效果。 (您的 C 实现可能使用 ASCII,在这种情况下它们是控制字符。\012 是换行符,因此它应该导致行前移,但您可能没有注意到。\034 是文件分隔符控件字符,当打印到常规终端显示器时可能无效。)

当您打印testArr 时,第一个位置的空字符结束了字符串。

【讨论】:

    猜你喜欢
    • 2020-10-30
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2014-05-05
    相关资源
    最近更新 更多