我有以下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;
}
Run Code Online (Sandbox Code Playgroud)
在这里查看实时代码
我在理解结果时遇到了麻烦,而且我用googled但我不确定我是否理解为什么字符串开头的空字符以及为什么中间的字符只会显示字符串"5".此外,当我将每个字符串字符分配给数组testArr然后尝试显示该字符数组时,尽管字符串和数组具有相同的字符,但结果却不同.所以,我对这些令人困惑的结果感到震惊,特别是他们的差异.使用字符串str,代码是否显示"5",因为空字符会覆盖内存中的内容?
此外,对于使用相同字符创建的数组,没有显示数组testArr中包含的数据.是否因为某些原因遇到第一个null而忽略其他所有内容?如果是这样,为什么包含相同字符的字符串str不会出现相同的行为?
八进制转义序列\后面跟着一到三个八进制数字,每个C 2018 6.4.4.4 1.按照6.4.4.4 7:"每个八进制或十六进制转义序列是可以构成转义序列的最长字符序列."所以,当编译器看到时"\012\0345",它将其解释为序列\012(十个),序列\034(二十八个)和字符5.
要表示您想要的字符串,您可以使用"\00012\000345".由于一个八进制转义序列停止在三个数字,这被解释为序列\000,字符1和2,序列\000,字符3,4和5.(空终止字符也将自动附加.)
打印时"\012\0345",打印出代码为10和28的字符,但没有明显的效果.(你的C实现可能使用ASCII,在这种情况下它们是控制字符.\012是新行,所以它应该导致行前进,但你可能没有注意到.\034是文件分隔符控制字符,可能没有打印到常规终端显示屏时的效果.)
打印时testArr,第一个位置的空字符结束了字符串.