2013-08-26 54 views
8

Tôi chỉ đọc kinh điển K & R và gặp phải cú pháp sau:?Ý nghĩa của "." trong printf

printf("%.*s",max,s); 

ý nghĩa của "." đây là gì Khi tôi không áp dụng một "." đây, sau đó toàn bộ chuỗi được in, nhưng khi chúng tôi không áp dụng ".", các ký tự tối đa tối đa sẽ được in. Tôi sẽ thực sự biết ơn nếu có ai có thể giải thích điều này.

+1

Bạn đã đọc tiêu chuẩn C chưa? Nó chỉ định cách làm việc này sẽ làm việc ... – DCoder

+3

@DCoder Đã làm việc với tiêu chuẩn C rất nhiều tôi tích cực là nó không thể * đọc * nó. –

+0

@NikolaiRuhe: điều đó có thể đúng đối với một số phần * của tiêu chuẩn, nhưng tôi thấy phần mô tả 'printf' là khá dễ đọc. – DCoder

Trả lời

11

Trong %.*s, số .* giới hạn số lượng byte sẽ được ghi. Nếu điều này được viết với một số bao gồm, chẳng hạn như %.34s, thì chữ số sẽ là giới hạn. Khi sử dụng dấu hoa thị, giới hạn được lấy từ đối số tương ứng với printf.

Từ C 2011 (N1570) 7.21.6.1 4, mô tả chi tiết kỹ thuật chuyển đổi cho fprintfet al:

Một chính xác tùy chọn cung cấp cho ... số lượng tối đa byte được viết cho s chuyển đổi . Độ chính xác có dạng của một khoảng thời gian (.) theo sau là dấu hoa thị * (được mô tả sau) hoặc bằng số nguyên thập phân tùy chọn; nếu chỉ có khoảng thời gian được chỉ định, độ chính xác được lấy bằng 0.

+0

Bạn có thể muốn viết, "trong'%. * S', phần '. *' Giới hạn ... "nếu không thì sẽ rất khó đọc. – Veltas

+0

Tôi sẽ thay thế 'chữ số' bằng 'số nguyên' hoặc 'số'. – Veltas

+0

@Veltas: Cảm ơn, tôi chèn "the" trước '. *'. Về số và số, số nguyên và số là đối tượng toán học. Một chữ số là ký hiệu (đặc biệt là một chuỗi các chữ số) biểu thị một số. Vì vậy, "34" là một chữ số và không phải là một con số, cùng một cách "sói" là một từ và không phải là một con vật. –

11

Nó chỉ rõ "Character Chuỗi rộng lĩnh vực tối đa"

Độ chính xác trong một định dạng chuỗi xác định chiều rộng lĩnh vực tối đa:

%2.6s

xác định chiều rộng tối thiểu là 2 và tối đa chiều rộng 6 ký tự. Nếu chuỗi lớn hơn 6 ký tự, chuỗi sẽ bị cắt bớt.

4

Chuỗi định dạng printf cho phép chỉ định chiều rộng và độ chính xác.

Chiều rộng, chẳng hạn như %25s, yêu cầu printf để đệm chuỗi có chiều rộng là 25 ký tự, chèn dấu cách trước chuỗi. (Nếu chuỗi rộng hơn 25 ký tự, nó vẫn được in toàn bộ.)

Độ chính xác được áp dụng cho định dạng chuỗi, chẳng hạn như %.25s, giới hạn độ dài của chuỗi được in thành 25 ký tự. Một chuỗi gồm 3 ký tự sẽ được in hoàn toàn (không có đệm) và một chuỗi gồm 30 ký tự sẽ bị thiếu năm ký tự cuối cùng.

%.*s tránh mã hóa chính xác định dạng theo định dạng, chỉ định nó thay cho đối số nguyên là printf, trong trường hợp của bạn là max.

+0

"Không biết định dạng thời gian được viết", điều này có nghĩa là gì? – Veltas

+0

@Veltas Khi bạn viết một định dạng như '% .25s', bạn biết rằng bạn sẽ cần độ chính xác 25 ký tự. Khi bạn viết '%. * S', bạn để nguyên độ chính xác chưa được xác định cho đến khi chạy. Tôi sẽ cố gắng làm rõ câu trả lời. – user4815162342

2

Trước hết, K & R là bản triển khai gốc của C, khác với thông số kỹ thuật hiện tại. Nếu bạn muốn có thông tin cụ thể về K & R C, hãy tham khảo tài liệu cụ thể.

Từ tiêu chuẩn hiện hành C:

Một chính xác tùy chọn cung cấp cho (...) số lượng tối đa byte được viết cho s chuyển đổi. Độ chính xác có dạng của một khoảng thời gian (.) theo sau là dấu hoa thị * (được mô tả sau) hoặc bằng số nguyên thập phân tùy chọn.

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

tài liệu tương tự có sẵn ở khắp mọi nơi trực tuyến với nhiều tiêu chuẩn hoặc triển khai:

1

Chấm có ý nghĩa khác với các chuỗi định dạng khác nhau. Nếu bạn sử dụng a.b với% f, thì b cho độ dài. một số điểm thập phân. nếu bạn sử dụng a.b với% s, một chuỗi sẽ cho độ dài tối thiểu của chuỗi. trong khi b cho chiều dài tối đa của chuỗi sẽ được in.