2015-08-28 89 views
4

任何人都可以解釋這段代碼中發生了什麼嗎?C字符串和十六進制字符

#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

'\ x01a'是'26' – BLUEPIXY

+0

因爲在這些字符串中的第五位字符具有的ASCII值'1'和'26'。 –

+0

使用'printf(「%s」,str)'來打印一個字符串。 – ouah

回答

3

的問題是與"\x01""a""\x01a",並且在詞彙處理的不同階段發生六角形>焦炭轉化和字符串連接的事實。

在第一種情況下,十六進制字符在連接 字符串之前被掃描和轉換,因此第一個字符被視爲\x01。然後,連接「a」爲 ,但已經執行了hex-> char轉換, 並且在連接後沒有重新掃描,因此您會得到兩個字母 \x01a

在第二種情況下,掃描儀看到\x01a爲單個字符, ASCII代碼26.

2

在C中,字符(比如"\x01")可具有兩個以上的數字。在第一種情況下,"\x01""a"是字符1,後跟'a'。在第二種情況下,"\x01a",這是字符0X1A,其是26.

+0

謝謝 是否有任何方法在字符串文字中寫入0x01來防止此錯誤? – Pikacz

+1

當然,無論是'「\ x01」「a」'或'「\ x01 \ x61」'。 –