2013-04-22 172 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