2013-08-26 1 views
8

Я просто читал классическую K & R и встречается следующий синтаксис:Значение "." в PRINTF

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

Что такое смысл "." здесь Когда я не применять "." здесь, то вся строка печатается, но когда мы не применяем ".", печатаются максимальные максимальные символы. Я буду очень благодарен, если кто-нибудь сможет это объяснить.

+1

Вы читали стандарт C? Он указывает, как это должно работать ... – DCoder

+3

@DCoder Работая со стандартом C, я уверен, что это невозможно * прочитать * это. –

+0

@NikolaiRu: это может быть правдой для определенных * частей * стандарта, но я считаю, что раздел, описывающий 'printf', вполне читаем. – DCoder

ответ

11

В %.*s.* ограничивает количество байтов, которые будут записаны. Если бы это было написано с включенной цифрой, например %.34s, то число было бы пределом. Когда используется звездочка, предел берется из соответствующего аргумента в printf.

От C 2011 (N1570) 7.21.6.1 4, описывающие характеристики преобразования для fprintfи др:

Опциональный точность, что дает ... максимальное количество записываемых байтов для сек конверсий , Точность принимает вид периода (.), за которым следует либо звездочка * (описано ниже), либо необязательное десятичное целое число; если задан только период, точность принимается равной нулю.

+0

Возможно, вы захотите написать «in'%. * S', часть '. *' Limits ... », в противном случае это трудно прочитать. – Veltas

+0

Я бы заменил 'numeral' на 'integer' или 'number'. – Veltas

+0

@Veltas: Спасибо, я вставляю "the" перед '. *'. Что касается цифр и чисел, целые числа и числа являются математическими объектами. Цифра представляет собой символы (в частности, строку цифр), обозначающую число. Итак, «34» - это цифра и не является числом, так же, как «волк» является словом и не является животным. –

11

Он определяет «строка символов Максимальная ширина поля»

Точность в формате строки задает максимальную ширину поля:

%2.6s

определяет минимальную ширину 2 и максимум ширина 6 символов. Если строка больше 6 символов, она будет усечена.

4

Строка формата printf позволяет указать ширину и точность.

Ширина, такая как %25s, сообщает printf, чтобы заполнить строку шириной до 25 символов, вставив пробелы перед строкой. (Если строка шириной более 25 символов, она по-прежнему печатается целиком.)

«Точность», применяемая к строковому формату, например %.25s, ограничивает длину печатной строки до 25 символов. Строка из 3 символов будет напечатана полностью (без заполнения), а строка из 30 символов будет отсутствовать в последних пяти символах.

%.*s избегает жесткого кодирования точности в формате, указывая вместо этого как целочисленный аргумент printf, в вашем случае max.

+0

«Неизвестно, в каком формате написано:« Что это значит? – Veltas

+0

@Veltas Когда вы пишете такой формат, как '% .25s', вы знаете, что вам понадобится точность 25 символов. Когда вы пишете '%. * S', вы оставляете точность неопределенной до времени выполнения. Я попытаюсь прояснить ответ. – user4815162342

2

Прежде всего, K & R - это оригинальная реализация C, которая отличается от текущей спецификации. Если вы хотите получить конкретную информацию о K & R C, обратитесь к соответствующей документации.

С текущего стандарта C:

необязательная точность, что дает (...) максимальное число байтов, которые будут написаны для з преобразований. Точность принимает вид периода (.), за которым следует либо звездочка * (описанная ниже), либо необязательное десятичное целое число.

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

Аналогичная документация доступна везде в Интернете для нескольких стандартов или реализаций:

1

Точка имеет различное значение с разными строками формата. Если вы используете a.b с% f, то b дает длину. a дает число десятичных точек. если вы используете a.b с% s, a даст минимальную длину строки. тогда как b дает максимальную длину строки, которая будет напечатана.

Смежные вопросы