Định dạng định dạng cho int short unsign là gì?


124

Tôi có chương trình sau

#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;
}

Mà khi biên dịch sử dụng gcc filename.cđã đưa ra cảnh báo sau (trong scanf()dòng).

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 functionsvà 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 unsignedcho intkiểu dữ liệu.

%uchỉ định 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 %uhvà nó vẫn đưa ra cảnh báo.


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

1
Không cần diễn viên; chương trình khuyến mãi mặc định chăm sóc nó.
R .. GitHub DỪNG GIÚP ICE

Câu trả lời:


155

Hãy thử sử dụng công cụ "%h"sửa đổi:

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

ISO / IEC 9899: 201x - 7.21.6.1-7

Chỉ định rằng một chỉ định chuyển đổi d, i, o, u, x, X hoặc n sau đây áp dụng cho một đối số có con trỏ kiểu thành ngắn hoặc không dấu ngắn .


47

Đối với scanf, bạn cần sử dụng %huvì bạn đang chuyển một con trỏ đến một unsigned short. Đối với printf, không thể vượt qua unsigned shortdo các chương trình khuyến mãi mặc định (nó sẽ được quảng cáo inthoặc unsigned inttùy thuộc vào việc intcó ít nhất bao nhiêu bit giá trị unsigned shorthay không) vì vậy %dhay %ulà tốt. Bạn được tự do sử dụng %hunếu bạn thích, mặc dù.


7

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

h Một chuyển đổi số nguyên sau đây tương ứng với một đối số int ngắn hoặc không dấu hoặc một fol‐
       chuyển đổi n thấp tương ứng với một con trỏ tới một đối số int ngắn.

Vì vậy, để in một số nguyên ngắn không dấu, chuỗi định dạng phải là "%hu".


Tôi không nghĩ đó là cách bạn "printf" ints ngắn vì chúng được tự động thăng cấp lên int (giống như ký tự).
Alexey Frunze

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ụ ý tôn trọng & 0xFFFF. & 0xFF trên số nguyên đã qua.
jørgensen

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.