Sự khác biệt giữa các chỉ định chuyển đổi% i và% d trong các hàm IO được định dạng (* printf / * scanf)


Câu trả lời:


276

Chúng giống nhau khi được sử dụng cho đầu ra, ví dụ với printf.

Tuy nhiên, chúng khác nhau khi được sử dụng làm công cụ xác định đầu vào, ví dụ như scanf, trong đó %dquét một số nguyên dưới dạng số thập phân đã ký, nhưng %imặc định là thập phân nhưng cũng cho phép thập lục phân (nếu đứng trước 0x) và bát phân (nếu đứng trước 0).

Vì vậy, 033sẽ là 27 với %inhưng 33 với %d.


8
Mong đợi một int với pad-zero có thể có trong sscanf dường như là hành vi mặc định hợp lý nhất. Nếu bạn không mong đợi Octal, điều đó có thể gây ra các lỗi tinh vi. Vì vậy, điều này cho thấy rằng% d là một công cụ xác định tốt để sử dụng khi bạn phải chọn một tùy ý, trừ khi bạn rõ ràng muốn đọc bát phân và / hoặc hex.
Eliot

2
Ah! Điều đó có ý nghĩa! Bây giờ tôi biết những gì cần tìm, điều này cũng có thể được nhìn thấy trong tài liệu cho printfscanf.
Gabriel Staples

67

Đây là giống hệt nhau printfnhưng khác nhau cho scanf. Cho printf, cả hai %d%ichỉ định một số nguyên thập phân đã ký. Cho scanf, %d%icũng có nghĩa là một số nguyên đã ký nhưng đặt %inội dung đầu vào dưới dạng số thập lục phân nếu đứng trước 0xvà bát phân nếu đứng trước 0và diễn giải đầu vào là số thập phân.


20

Không có sự khác biệt giữa các định dạng %i%dđịnh dạng cho printf. Chúng ta có thể thấy điều này bằng cách vào tiêu chuẩn dự thảo C99 phần 7.19.6.1 Chức năng fprintf mà cũng bao gồm printfsự tôn trọng sang định dạng specifiers với và nó nói tại khoản 8 :

Các chỉ định chuyển đổi và ý nghĩa của chúng là:

và bao gồm các viên đạn sau:

d,i     The int argument is converted to signed decimal in the style
        [−]dddd. The precision specifies the minimum number of digits to
        appear; if the value being converted can be represented in fewer
        digits, it is expanded with leading zeros. The default precision is
        1. The result of converting a zero value with a precision of zero is
        no characters.

Mặt khác, để scanfcó sự khác biệt, %dgiả sử cơ sở 10 trong khi %itự động phát hiện cơ sở. Chúng ta có thể thấy điều này bằng cách vào phần 7.19.6.2 Chức năng fscanf trong đó bao gồm scanfsự tôn trọng để format specifier với, tại khoản 12 nó nói:

Các chỉ định chuyển đổi và ý nghĩa của chúng là:

và bao gồm những điều sau đây:

d     Matches an optionally signed decimal integer, whose format is the
      same as expected for the subject sequence of the strtol function with
      the value 10 for the base argument. The corresponding argument shall
      be a pointer to signed integer.

i     Matches an optionally signed integer, whose format is the same as
      expected for the subject sequence of the strtol function with the
      value 0 for the base argument. The corresponding argument shall be a
      pointer to signed integer.

4

Không có bất kỳ trong printf- hai là từ đồng nghĩa.


6
Có một sự khác biệt khi được sử dụng trong scanf()chuỗi định dạng như câu trả lời được chấp nhận nói.
J ... S
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.