2012-11-16 31 views
65

Tôi biết điều này nghe không hiệu quả, nhưng tôi đang tìm cách ghi nhớ tất cả các mã định dạng cho các cuộc gọi printf. %s, %p, %f là tất cả rõ ràng, nhưng tôi không thể hiểu nơi %d xuất phát từ. Có phải %i đã được thực hiện bởi cái gì khác không?tại sao% d đứng cho Số nguyên?

+18

Đoán tốt nhất của tôi là số thập phân –

+0

Có tuy nhiên, đây là một câu hỏi thú vị. – Daniel

+0

Mặc dù nó không phải là một câu hỏi lập trình thực sự, và tôi có xu hướng đóng những câu hỏi đó :) –

Trả lời

83

viết tắt của "decimal" (cơ sở 10), không phải là "số nguyên". Bạn có thể sử dụng %x để in ở hexadecimal (cơ sở 16) và %o để in ở octal (cơ sở 8). Một số nguyên có thể nằm trong bất kỳ căn cứ nào trong số này.

Trong printf(), bạn có thể sử dụng %i như một từ đồng nghĩa với %d, nếu bạn thích để chỉ "số nguyên" thay vì "thập phân", nhưng %d thường được ưa thích vì nó là cụ thể hơn.

Khi nhập, sử dụng scanf(), bạn cũng có thể sử dụng cả số %i%d. %i có nghĩa là phân tích cú pháp dưới dạng số nguyên trong bất kỳ cơ sở nào (bát phân, thập lục phân hoặc thập phân, như được chỉ ra bởi tiền tố 0 hoặc 0x), trong khi %d có nghĩa là phân tích cú pháp dưới dạng số nguyên thập phân.

Dưới đây là một ví dụ về tất cả trong số họ trong hành động:

#include <stdio.h> 

int main() { 
    int out = 10; 
    int in[4]; 

    printf("%d %i %x %o\n", out, out, out, out); 
    sscanf("010 010 010 010", "%d %i %x %o", &in[0], &in[1], &in[2], &in[3]); 
    printf("%d %d %d %d\n", in[0], in[1], in[2], in[3]); 
    sscanf("0x10 10 010", "%i %i %i", &in[0], &in[1], &in[2]); 
    printf("%d %d %d\n", in[0], in[1], in[2]); 

    return 0; 
} 

Vì vậy, bạn chỉ nên sử dụng %i nếu bạn muốn cơ sở đầu vào phụ thuộc vào tiền tố; nếu cơ sở đầu vào phải được sửa, bạn nên sử dụng %d, %x hoặc %o. Đặc biệt, thực tế là một hàng đầu 0 đặt bạn ở chế độ bát phân có thể bắt kịp bạn.

+0

Cảm ơn bạn đã giải thích lý do tại sao% i hoạt động theo cách đó. – clementine

7

http://en.wikipedia.org/wiki/Printf_format_string dường như để nói rằng đó là cho số thập phân như tôi đã đoán

d,i

int dạng số thập phân đã ký kết. '% d' và '% i' đồng nghĩa với đầu ra , nhưng khác khi được sử dụng với scanf() cho đầu vào (sử dụng% i sẽ diễn giải một số dưới dạng thập lục phân nếu nó đứng trước 0x và bát phân nếu nó đứng trước 0.)

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