2012-10-17 67 views
14

Đọc this SO question, tôi bắt đầu tự hỏi - cách chính xác để sử dụng scanf/printf (và gia đình) với các loại kích thước cố định là gì?Cách đúng để sử dụng scanf/printf (và gia đình) với các loại kích thước cố định?

Ví dụ: nếu tôi có short int hoặc int, tôi sẽ sử dụng lần lượt %hd%d - tiền phạt.

Nhưng nếu tôi có int16_t thì sao? short int có thể khác với int16_t, phụ thuộc vào nền tảng. Tương tự cho các loại kích thước cố định khác (tích phân)?


LƯU Ý: Vì nó trông giống như tôi đã nhận được một số xuống phiếu, bởi vì tôi "không cố gắng google này", có vẻ như tôi cần phải giải thích: Tôi không xem câu hỏi tương tự ở đây, đó là lý do tại sao tôi đăng nó. Hầu hết các câu hỏi trong SO có thể đã được trả lời bằng Google, thay vì hỏi ở đây. Điều đó sẽ làm cho StackOverflow không phải là nơi mà nó thực sự là bây giờ.

Và KHÔNG, tôi không làm điều này vì danh tiếng - Tôi đã đạt đến giới hạn danh tiếng hàng ngày hôm nay (có 24 phiếu bầu trước khi đăng câu hỏi này).

Quan điểm của tôi là - Tôi không nghĩ rằng điều này xứng đáng được bỏ phiếu.

+1

Đừng quên sử dụng người bạn tốt của bạn google. ;) Đã đạt được lượt truy cập khi tìm kiếm: ["printf int16_t"] (https://www.google.com/#hl=vi&output=search&sclient=psy-ab&q=printf+int16_t&oq=printf+int16_t&gs_l=hp.3. ..741.1861.0.2073.8.7.0.0.0.0.267.267.2-1.1.0.les% 3B..0.0 ... 1c.1.7MPX56CVufA & pbx = 1 & bav = on.2, hoặc.r_gc.r_pw.r_cp.r_qf. & fp = ec63c9d2be74365f & bpcl = 35277026 & biw = 1343 & bih = 748). – Mike

+0

@Mike - Tôi đã không :) Tôi nghĩ rằng nó sẽ là tốt để có câu hỏi tương tự ở đây (và không, không phải vì danh tiếng - Tôi đã nhấn cap danh tiếng hàng ngày ngày hôm nay (có 24 upvotes cho đến bây giờ)). Tôi không nghĩ rằng điều này xứng đáng được bình chọn. –

+0

+1 Đồng ý với chỉnh sửa của bạn. Cảm ơn bạn đã làm rõ. – Mike

Trả lời

13

Cách đúng là sử dụng inttypes.h trong đó xác định các macro tiêu chuẩn cho printf gia đình và scanf gia đình, ví dụ

printf ("%" PRId16, short_int); 
scanf ("%" SCNd16, &short_int); 
+0

Tuyệt vời, cảm ơn :) +1 và được chấp nhận. –

+0

Tại sao điều này tốt hơn '% d'? Không phải đoạn mã ngắn sẽ được chuyển thành 'int'? –

4

Tệp tiêu đề inttypes.h chứa macro xác định đúng định dạng số liệu cho số nguyên chiều rộng cố định được xác định trong stdint.h. Ví dụ: trình chỉ định loại cho printf()int16_t là macro có tên PRId16. Ví dụ:

int16_t x; 
scanf("%" SCNd16, &x); 

printf("You have entered: %" PRId16 "\n", x); 
+1

Macro không bao gồm ký tự '%' bắt buộc. –

+0

@ Steve-o đã được sửa. –

Các vấn đề liên quan