2012-01-02 44 views
90

tôi có chương trình sau đâyTrình định dạng định dạng cho ký tự ngắn chưa được ký là gì?

#include <stdio.h> 

int main(void) 
{ 
    unsigned short int length = 10; 

    printf("Enter length : "); 
    scanf("%u", &length); 

    printf("value is %u \n", length); 

    return 0; 
} 

nào khi biên soạn sử dụng gcc filename.c ban hành sau cảnh báo (trong dòng scanf()).

warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]

sau đó tôi gọi các C99 specification - 7.19.6 Formatted input/output functions và không thể hiểu được format specifier chính xác khi sử dụng các từ bổ nghĩa chiều dài (như short, long, vv) với unsigned cho int kiểu dữ liệu.

Có phải %u thông số chính xác unsigned short int? Nếu vậy tại sao tôi nhận được cảnh báo nêu trên ?!

EDIT: Hầu hết thời gian, tôi đã cố gắng %uh và nó vẫn đưa ra cảnh báo.

+2

'printf ("% u \ n ", (chiều dài không dấu); // 'luôn hoạt động, vì thông số C99 bạn đọc đảm bảo rằng' sizeof (short) <= sizeof (int) '(nhưng câu trả lời thực tế cho câu hỏi này dưới đây dĩ nhiên đẹp hơn) – Philip

+1

Không cần dàn diễn viên; quảng cáo mặc định sẽ chăm sóc nó. –

Trả lời

118

Hãy thử sử dụng "%h" modifier:

scanf("%hu", &length); 
     ^

ISO/IEC 9899: 201x - 7.21.6.1-7

Chỉ định rằng một d sau, i, o, u, x, X hoặc n chuyển đổi chỉ định áp dụng cho đối số có loại con trỏ là ngắn hoặc không được ký ngắn.

+0

Tài liệu nguồn, vui lòng? – sergiol

+1

@sergiol Tôi đã thêm nguồn. – cnicutar

6

Từ trang hướng dẫn Linux:

 
h  A following integer conversion corresponds to a short int or unsigned short int argument, or a fol‐ 
     lowing n conversion corresponds to a pointer to a short int argument. 

Vì vậy, để in một số nguyên ngắn unsigned, chuỗi định dạng nên "%hu".

+0

Tôi không nghĩ rằng đó là cách bạn "printf" ngắn ints vì chúng được tự động quảng cáo để ints (giống như ký tự). –

+2

@Alex% hu /% hd trong printf không hoạt động. Đó là% hhu /% hhd chỉ có sẵn bắt đầu với C99. % h và% hh ngụ ý một & 0xFFFF resp. & 0xFF trên số nguyên được truyền. –

+0

@ jørgensen: bạn nói đúng, nó ở trong tiêu chuẩn. –

36

Đối với scanf, bạn cần sử dụng %hu vì bạn đang chuyển con trỏ đến unsigned short. Đối với printf, nó không thể vượt qua một unsigned short do chương trình khuyến mãi mặc định (nó sẽ được thăng int hay unsigned int tuỳ thuộc vào việc int có ít nhất là nhiêu bit giá trị như unsigned short hay không) để %d hoặc %u là tốt. Bạn được tự do sử dụng %hu nếu bạn thích, mặc dù.

+6

+1 để đề cập đến các chương trình khuyến mãi mặc định trong 'printf()'. Cảm ơn! –

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