我有以下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不会出现相同的行为?
答案 0 :(得分:8)
根据C 2018 6.4.4.4 1.八进制转义序列为\
,其后为1-3个八进制数字。根据6.4.4.4 7:“每个八进制或十六进制转义序列是可以因此,当编译器看到"\012\0345"
时,它将解释为序列\012
(为十),序列\034
(为二十八),和字符5
。
要表示您想要的字符串,可以使用"\00012\000345"
。由于八进制转义序列以三位数停止,因此将其解释为序列\000
,字符1
和2
,序列\000
和字符{{1 }},3
和4
。 (空终止符也将自动添加。)
打印5
时,代码为10和28的字符已打印,但没有可见效果。 (您的C实现可能使用ASCII,在这种情况下,它们是控制字符。"\012\0345"
是换行符,因此它应该导致行前进,但是您可能没有注意到。\012
是一个换行符。文件分隔符控制字符,当打印到常规终端显示器上时可能无效。)
打印\034
时,第一个位置的空字符结束于字符串。