О строке формата printf в C

Возьмем следующую программу:

#include <stdio.h>

int main()
{
    long t =57 ;
    printf("[%+03ld]", t);
}

и его вывод:

[+57]

Я как-то запутался: я сказал ему дополнить вывод до ширины 3 (03ld) нулями, однако кажется, что если я заставлю вывод поставить знак плюс перед числом (+), он не добавит требуемых нулей, если длина номера уже 2 цифры (как в 57). Для чисел ‹10 он дополняется 1 нулем.

Из http://www.cplusplus.com/reference/cstdio/printf/

(0) -> Дополняет число слева нулями (0) вместо пробелов, если указано заполнение (см. подспецификатор ширины).

(+) -> Заставляет предварять результат знаком плюс или минус (+ или -) даже для положительных чисел. По умолчанию знак - предшествует только отрицательным числам.

(ширина) -> Минимальное количество символов для печати. Если печатаемое значение короче этого числа, результат дополняется пробелами. Значение не усекается, даже если результат больше.

Поэтому мне просто нужно пояснение... Спецификатор (width) из приведенной выше цитаты относится к полной длине выходной строки (т.е. к символам, которые будут напечатаны), контролируемой этим спецификатором формата ("%+03ld"), или к полной длине символов числа, которое будет напечатано?


person Ferenc Deak    schedule 09.10.2014    source источник
comment
(ширина) -> Минимальное количество символов для печати. Я не знаю, что еще вам нужно; это настолько ясно, насколько это возможно.   -  person James Kanze    schedule 09.10.2014


Ответы (5)


Да, спецификатор ширины относится к ширине всего отформатированного результата, +57 в вашем случае. Это делает его полезным для печати столбцового текста для удобного чтения на экране (важно, если вы используете C для написания текстовой утилиты старой школы!).

person John Zwinck    schedule 09.10.2014

Стандарт C достаточно точен, так как преобразованное значение берется целиком. Из C11 §7.21.6/2 (выделено мной):

Функция fprintf записывает вывод в stream, на который указывает stream, под управлением строки, на которую указывает формат, определяющий, как последующие аргументы преобразовываются для вывода.

вместе с §7.21.6/4:

Необязательная минимальная ширина поля. Если преобразованное значение содержит меньше символов, чем ширина поля, оно дополняется пробелами (по умолчанию) слева (или справа, если был задан левый флаг корректировки, описанный ниже) до ширина поля. Ширина поля принимает форму звездочки * (описанной ниже) или неотрицательного десятичного целого числа.

person Grzegorz Szpetkowski    schedule 09.10.2014

Как вы указали «Минимальное количество символов для печати», поэтому «+» - это просто еще один символ для printf. Кстати, нули «0» — это тоже просто символы и не имеют ничего общего с числами. Это может быть любой персонаж.

person delbertooo    schedule 09.10.2014

Да, ширина поля относится к полному преобразованному значению, включая десятичные точки, знаки и т. д.

person dom0    schedule 09.10.2014

Вы запросили формат длины из 3 символов и получили 3 символа +57. Если вы хотите, чтобы 0 присутствовал, просто используйте printf("[%+04ld]", t);, и вы получите +057.

person Serge Ballesta    schedule 09.10.2014