2013-04-22 17 views
6

próbuję zmienić dane w tablicy, to jest część mojego kodu:Scanf unsigned char w hex

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]); 

Kiedy mój wkład jest na przykład 88.88.88.88.88.88 ustawia paket[0] - paket[5] do 88, ale również zmienia paket[6],paket[7] i paket[8] do 0.

Jak to możliwe i jak to naprawić? Muszę zmienić tylko [0] - [5]

+0

Deklaracja swojej 'u_char' Array może zainicjować wszystkich elementów 0. Odpowiedź jakiegoś członka, który usunęła minutę temu, była być może słuszna: możesz skanować int aka 4 bajty/znaki na każdym identyfikatorze formatu w systemie Big-endian. – collapsar

+0

Ach, mój błąd, nie wysłałem całego kodu. Między pierwszym a drugim rzędem ładuję dane do tej tablicy. Więc przed skanowaniem te elementy nie są ustawione na 0, problem jest z scanf. – user2306381

Odpowiedz

0

kodzie jest w porządku

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

nie zmienia wartości paket[6], paket[7] and paket[8].

4

Twój kod jest prawidłowy dla C99 i późniejszych. Prawdopodobnie używasz standardowej biblioteki C, która nie obsługuje modyfikatora długości hh, który został wprowadzony w C99; prawdopodobnie standardowa biblioteka Microsoft C.

Jeśli chcesz wesprzeć ten stary C biblioteki standardowej, trzeba będzie przepisać kod C89 być kompatybilne, na przykład:

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

Wielkie dzięki! btw bez znaku p [6]; lub unsigned char p [6]; ? czy nie ma to znaczenia? – user2306381

+0

@ user2306381: Musi to być 'unsigned p [6];', ponieważ '% x' wymaga wskaźnika do' unsigned', * not * wskaźnika do 'unsigned char'. – caf