C字符串和十六进制字符

时间:2015-08-28 17:19:40

标签: c c-strings

有人能解释一下这段代码中发生了什么吗?

    #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

2 个答案:

答案 0 :(得分:4)

问题在于"\x01""a""\x01a",以及hex-&gt; char转换和字符串连接在词法处理的不同阶段发生的事实。

在第一种情况下,在连接之前扫描并转换十六进制字符 字符串,因此第一个字符被视为\x01。那么&#34; a&#34;是 连接,但是已经执行了hex-> char转换, 连接后没有重新扫描,所以你得到两个字母 \x01a

在第二种情况下,扫描程序将\x01a视为单个字符, 使用ASCII码26。

答案 1 :(得分:2)

在C中,以十六进制指定的字符(如"\x01")可以有两位以上的数字。在第一种情况下,"\x01""a"是字符1,后跟'a'。在第二种情况下,"\x01a",即字符0x1a,即26。