当尝试在字符串中使用'\x05'
时,编译的C代码在处理值时似乎表现得很奇怪。
例如,当使用以下字符串时:
char *weird = "\x04\x68\x65\x79\x79\x03\x6e\x65\x74\x05\x6c\x6f\x63\x61\x6c\x00";
打印字符串的每个字符时,'\x05'
不对应于整数5,而'\x04'
和'\x03'
分别对应于整数4和3。
以下for循环演示了问题:
for(int i = 0; i < strlen(question); i++){
printf("question[%d] = %c\n", i, question[i]);
}
输出:
为什么'\x05'
这个具体案例如此麻烦?
答案 0 :(得分:4)
%c
格式说明符用于作为参数提供的相应整数值的可打印字符表示。根据ASCII编码,0x03
,0x04
或0x05
都不是可打印的值!!
为了确认,您可以在尝试打印之前将相同的值传递给 isprint()
。如果你选择打印它,&#34;显示&#34;最终取决于您的终端如何选择解释显示。
答案 1 :(得分:3)
你的假设是错误的。 ASCII代码3,4和5 not 对应于(可见)整数3
,4
和5
。
您所看到的是您认为打算打印的本地终端翻译:
它不会尝试解释代码3
和4
。这些对应于ASCII控制字符End of Text
和End of Transmission
,但您的终端选择不处理它们。因此,它将这两个代码字面地写入输出流,它会查找合适的字体来显示它们。在现代(Unicode)字体中,这些字符没有字符,因为它们不是假定是&#34;打印&#34;。然而,一些终端意识到这一点,并提供一个后备,所以你至少可以看到一些东西。
另一方面,代码5
由您的终端解释:&#34;信号用于在接收端触发响应,以查看是否它仍然存在。&#34;终端发送该信号,接收(最有可能)a&#34;是&#34;回答 - 是的,输出流是活动的 - 并继续输出文本的其余部分。因为它是信号而不是字符,所以不显示任何内容。
此行为不是0x05
代码的唯一行为。你没有在你的问题中提到它,但是当你打印&#34;打印时,你似乎并不惊讶。 \n
&#39; 即使它也会向输出流发送代码0x0A
。并且不在屏幕上显示10
但光标向下移动一行。同样,这是因为终端会解释代码以采取某些特定操作。
答案 2 :(得分:0)