2013-04-22 173 views
6

我想在陣列,以改變數據SCANF無符號的字符,這是我的代碼部分:十六進制

u_char paket[100]; 
//here i put some data into array and then trying to change it by user 
scanf("%hhx.%hhx.%hhx.%hhx.%hhx.%hhx", &paket[0], &paket[1], &paket[2], &paket[3], &paket[4], &paket[5]); 

當我輸入的是例如88.88.88.88.88.88它設置paket[0] - paket[5]到88,但它也改變paket[6],paket[7]paket[8]設置爲0.

怎麼可能以及如何修復它?我只需要改變[0] - [5]

+0

你'u_char'數組的聲明可能會初始化所有元素0.一些研究員的答案是刪除它一分鐘前的答案或許是對的:你可能在一個Big-endian系統的每個格式標識符上掃描int aka 4個字節/字符。 – collapsar 2013-04-22 07:44:18

+0

啊,我的錯,我沒有發佈整個代碼。在第一行和第二行之間,我將數據加載到該數組中。所以在scanf之前,這些元素沒有設置爲0,問題在於scanf。 – user2306381 2013-04-22 07:47:39

回答

0

你的代碼是罰款

u_char paket[100]; 
scanf("%hhx.%hhx.%hhx.%hhx.%hhx.%hhx", &paket[0], &paket[1], &paket[2], &paket[3], &paket[4], &paket[5]) 

不改變的paket[6], paket[7] and paket[8]值。

4

您的代碼對於C99及更高版本是正確的。想必您使用的C標準庫不支持C99中引入的長度修飾符hh;可能是Microsoft C標準庫。

如果您需要支持這個老C標準庫,你將不得不重寫代碼爲C89兼容,例如:

unsigned p[6]; 

if (scanf("%x.%x.%x.%x.%x.%x", &p[0], &p[1], &p[2], &p[3], &p[4], &p[5]) == 6) 
{ 
    int i; 
    for (i = 0; i < 6; i++) 
     paket[i] = p[i]; 
} 
+0

非常感謝! btw unsigned p [6];或unsigned char p [6]; ?或無所謂? – user2306381 2013-04-22 09:45:38

+0

@ user2306381:它需要是'unsigned p [6];',因爲'%x'需要一個指向'unsigned'的指針,而不是*指向'unsigned char'的指針。 – caf 2013-04-22 13:07:55