2013-04-02 58 views
6

Tôi biết rằng việc đặt bất kỳ số nào của 0 trước khi chiều rộng của trình giữ chỗ thực hiện không đệm. Ví dụ: printf("%02d", 6); in 06.Sự khác nhau giữa% 0,2lf và% .2lf là phần giữ chỗ printf là gì?

Nhưng điều gì đặt một đơn 0 trước độ chính xác của trình giữ chỗ? Ví dụ: đối với cả hai printf("%0.2lf", 0.123);printf("%.2lf", 0.123);, đầu ra là 0.12.

Nếu không có gì, có định dạng ưa thích không?

+0

@teppic, 0 không có nghĩa là chiều rộng tối thiểu là 0 (loại thông tin vô dụng nào?). 0 là một cờ có nghĩa là 0-pad thay vì không gian-pad. Tôi có thể nhìn thấy từ câu trả lời của bạn rằng bạn đã biết điều đó, vì vậy xin vui lòng ngừng nói nó có nghĩa là "chiều rộng tối thiểu là 0" bởi vì nó không. – Shahbaz

+0

@Shahbaz - Tôi đã nói về trường hợp cụ thể này, nhưng vì nó có vẻ gây nhầm lẫn nên tôi đã xóa nhận xét đó. – teppic

Trả lời

6

Chúng là "tương đương". Nếu bạn sử dụng "% 07.2", thì nó sẽ tạo ra sự khác biệt, bằng cách thêm các số 0 ở phía trước.

Chỉnh sửa: Ban đầu có "% 04.2", tất nhiên không tạo ra bất kỳ sự khác biệt nào, bởi vì một phao có hai số thập phân luôn luôn là 4 rộng.

+0

Không phải là ('0'-padding) được bỏ qua cho điểm nổi nếu có độ chính xác được xác định rõ ràng? – dyp

+0

Ít nhất là khi thử nghiệm trong gcc trên Linux, không đệm "hoạt động". Tôi khá chắc chắn đó là một phần của tiêu chuẩn, nhưng tôi là một chút lười biếng, vì vậy tôi sẽ chờ đợi cho người khác để chỉ ra rằng tôi là sai. –

+0

@DyP - phần đệm bằng 0 ở bên trái, ví dụ: 0003.12. Nó không hoạt động cho số không sau dấu thập phân. – teppic

3


%3.2f //(print as a floating point at least 3 wide and a precision of 2)

%0.2lf //(print as a floating point at least 0 wide and a precision of 2)

%.2lf //(print as a floating point at least 0(default) wide and a precision of 2)

1

Blockquote

Về cơ bản khi chúng ta % w.p f cho đầu ra w đề cập đến số lượng tối thiểu của vị trí để được sử dụng để hiển thị các giá trị và p là số chữ số sau dấu thập phân. %3.2f điểm nổi có 3 rộng và 2 số sau chữ số thập phân

%0.2f điểm nổi ít nhất 0 rộng và 2 số sau chữ số thập phân

%.2f điểm nổi ít nhất 0 (mặc định) rộng và độ chính xác của 2)

Nhưng đừng hiểu sai về chiều rộng 0 nếu bạn sử dụng %0.2f, nó có thể tự động điều chỉnh độ rộng tối thiểu của nó.

1

Những ví dụ này sẽ hiển thị sự khác biệt:

"%0.2lf", 0.123 - (chiều rộng từ 0, nơi 2 chữ số thập phân không đệm phút).>0.12.

"%6.2lf", 0.123 - (. Không gian đệm phút chiều rộng của 6, 2 chữ số thập phân)>__0.12.

"%06.2lf", 0.123 ->000.12 (chiều rộng tối thiểu là 0, 2 chữ số thập phân).

"%0.6lf", 0.123 ->0.123000 (chiều rộng tối thiểu 0, 6 chữ số thập phân).

Số 0 đầu tiên chỉ định không đệm, tiếp theo là chiều rộng tối thiểu, có độ mặc định bằng 0. Vì vậy, nó bị bỏ qua một cách hiệu quả (vì bạn không thể đệm chiều rộng 0).


Ngẫu nhiên, biểu mẫu chính xác là %f, không %lf cho printf.

+0

Trong khi chúng ta đang ở đó, quy tắc khuyến mãi số nguyên (xem C11, 6.5.2.2.6) buộc giá trị dấu phẩy động được chuyển thành 'double'. Điều này có nghĩa là cả hai 'float' và' double' đều đạt 'printf' là' double' và do đó '% f' và'% lf' đều mong đợi 'double' và do đó giống nhau. Đây là lý do tại sao bạn cũng không bao giờ thấy '% hd' vì nó hoạt động giống hệt'% d'. Ngoài ra đây là lý do tại sao bạn không cần phải cast char vào int nếu nó được gán cho '% d'. Lưu ý phụ: điều này không giống với 'scanf', vì' char * 'chẳng hạn không được thăng cấp thành' int * '! – Shahbaz

+0

@Shahbaz - như một điểm phụ, vâng. Nếu tôi nhớ chính xác '% lf' được cho phép trong C99 nhưng' l' hoàn toàn bị bỏ qua - mặc dù% lf có thể gây ra vấn đề cho các trình biên dịch cũ hơn. – teppic

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