2013-04-22 38 views
6

Tôi cố gắng để thay đổi dữ liệu trong mảng, đây là một phần của mã của tôi:scanf char unsigned trong 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]); 

Khi đầu vào của tôi là ví dụ 88.88.88.88.88.88 nó đặt paket[0] - paket[5]-88, nhưng nó cũng thay đổi paket[6],paket[7]paket[8] tới 0.

Làm cách nào để khắc phục sự cố? Tôi cần phải thay đổi chỉ [0] - [5]

+0

Việc kê khai của 'u_char' mảng của bạn có thể khởi tạo tất cả các yếu tố để 0. câu trả lời của một số thành viên đã xóa nó một phút Ago có lẽ đúng: bạn có thể Quét một int aka 4 Bytes/ký tự trên mỗi định dạng định dạng trên một hệ thống Big-endian. – collapsar

+0

Ah, sai lầm của tôi, tôi đã không đăng toàn bộ mã. Giữa hàng đầu tiên và hàng thứ hai tôi tải dữ liệu vào mảng đó. Vì vậy, trước khi scanf những yếu tố không được thiết lập để 0, vấn đề là với scanf. – user2306381

Trả lời

0

Mã của bạn là tốt

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

Không thay đổi các giá trị của paket[6], paket[7] and paket[8].

4

Mã của bạn là chính xác cho C99 trở lên. Có lẽ bạn đang sử dụng một thư viện chuẩn C không hỗ trợ sửa đổi độ dài hh, được giới thiệu trong C99; có lẽ là thư viện chuẩn của Microsoft C.

Nếu bạn cần hỗ trợ thư viện chuẩn C cũ này, bạn sẽ phải viết lại mã của bạn để được C89-tương thích, ví dụ:

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

Cảm ơn rất nhiều! btw unsigned p [6]; hoặc unsigned char p [6]; ? hoặc không quan trọng? – user2306381

+0

@ user2306381: Nó cần phải là 'unsigned p [6]; ', bởi vì'% x' yêu cầu một con trỏ tới 'unsigned', * not * một con trỏ tới' unsigned char'. – caf