2010-03-10 40 views
4

我通常使用指針通過以下方式如何使用十六進制表示法將值賦給char *?

 
    char *ptr = malloc(sizeof(char) * 100); 
    memset(ptr, 0, 100) ; 
    strncpy(ptr, "cat" , 100 - 1); 

但這一次,而不是使用「貓」,我想用它ASCII十六進制等價的。

貓= 0x63,0x61,0x74,0×00

我試圖

 
    strncpy(ptr, "0x630x61" , 100 - 1); 

但預期它失敗。

什麼是正確的語法?

我是否需要放一個0x00?一會兒讓我們忘記memset,現在我需要把一個0x00?因爲在「貓」符號中,空值會自動放置。

問候

+0

什麼是這個實際使用?這是中期利益和中期這可能會幫助驅動一個更好的答案... – Romain 2010-03-10 21:35:55

+0

這是有關一些UNICODE字符?你爲什麼想做這個? – dirkgently 2010-03-10 21:36:03

+0

@Romain這個問題一直在問(但很難搜索) - 我懷疑問題的深刻誤解 – 2010-03-10 21:37:31

回答

10

\xXX爲十六進制格式插入字符的語法。所以你會:

strncpy(ptr, "\x63\x61\x74", 100 - 1); 

你並不需要把在\x00因爲具有自動報價空分隔字符串。

2
strncpy(ptr, "\x63\x61" , 100 - 1); 

0x63是一個整數十六進制文字; C編譯器在代碼中解析它。但是在一個字符串中,它被解釋爲一個字符序列0,x,6,3。 值爲63(十六進制)的char的文字。是'\x63',並且在字符串內您必須使用此表示法。 "c\x63"是字符串零終止的字符串,無論引號內的字符(或表示它們的符號),所以不需要手動追加尾隨零。

4

注意,你只需要在\「」串

char cat[4]; 
cat[0] = 0x63; 
cat[1] = 0x61; 
cat[2] = 0x74; 
car[3] = 0x00; 

char cat[] = "\x63\x61\x74"; // note the \0 is added for you 

char cat[] = { 0x63, 0x61, 0x74, 0x00 }; 

裏面都是一樣的

+2

我喜歡你展示三種選擇的方式,但「\ 0x63 \ 0x61 \ 0x74」是錯誤的。它創建一個包含字符'0','x','6','3',0,...'的數組。當用作nul終止的字符串時,這是零長度。 – 2010-03-10 22:37:30

+0

抱歉 - 剪切並粘貼錯誤! – 2010-03-10 23:50:20

+2

儘管生成的可執行文件將具有相同的_behavior_,但這些都不是**,都是一樣的:0x63是一個將被轉換爲「char」的「int」文字。有些編譯器會爲此發出「截斷」警告。 'char x ['] = {'\ x63','\ x61','\ x74','\ x00'};'將和'char cat [] =「\ x63 \ x61 \ x74」並不會生成編譯器警告。 – 2013-04-13 00:51:27

相關問題