C 字符串和十六进制字符

5

有人能解释一下这段代码在做什么吗?

    #include <stdio.h>

    void f(const char * str) {
      printf("%d\n", str[4]);
    }

    int main() {
      f("\x03""www""\x01""a""\x02""pl");
      f("\x03www\x01a\x02pl");
      return 0;
    }

为什么输出为空?
    1
    26

因为在这些字符串中,第五个位置的字符具有ASCII值为126 - Eugene Sh.
使用 printf("%s", str) 打印字符串。 - ouah
2个回答

6
问题出在 "\x01""a" 与 "\x01a"之间的差异,以及十六进制到字符转换和字符串连接发生在不同的词法处理阶段。
在第一种情况下,在连接字符串之前扫描十六进制字符并进行转换,因此第一个字符被视为 "\x01"。然后连接"a",但是十六进制到字符的转换已经执行过了,在连接之后不会重新扫描,因此得到两个字母"\x01" 和 "a"。
在第二种情况下,扫描器将 "\x01a" 视为单个字符,其 ASCII 码为 26。

3

C语言中,使用16进制表示的字符(例如"\x01")可能会有超过两位的数字。在第一种情况下,"\x01""a"是字符1,后跟'a'。在第二种情况下,"\x01a"表示的是0x1a字符,该字符的十进制值为26。


有没有一种方法可以在字符串字面值中编写0x01以防止此错误?谢谢。 - Pikacz
1
当然,可以使用 "\x01""a" 或者 "\x01\x61" - Lee Daniel Crocker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接