Что будет после%?

Я немного искал это, но я не получил особенно прямого ответа. В C (и я думаю, C ++), как вы определяете, что следует за% при использовании printf? Например:

double radius = 1.0;
double area = 0.0;
area = calculateArea( radius );
printf( "%10.1f     %10.2\n", radius, area );

Я взял этот пример прямо из моей книги на языке Си. Это не имеет смысла для меня вообще. Где вы придумали 10.1fи 10.2f? Может кто-нибудь объяснить это?

5 c
20.08.2008 13:44:34
8 ОТВЕТОВ
РЕШЕНИЕ

http://en.wikipedia.org/wiki/Printf#printf_format_placeholder - это ссылка Википедии на заполнители формата в printf. http://www.cplusplus.com/reference/clibrary/cstdio/printf.html также полезен

В основном в простой форме это% [ширина]. [Точность] [тип]. Ширина позволяет вам убедиться, что печатаемая переменная имеет как минимум определенную длину (полезно для таблиц и т. Д.). Точность позволяет вам указать точность, с которой печатается число (например, десятичные разряды и т. Д.), И сообщает C / C ++, что это за переменная, которую вы задали (символ, целое, двойное и т. Д.).

Надеюсь это поможет

ОБНОВИТЬ:

Чтобы уточнить, используя ваши примеры:

printf( "%10.1f     %10.2\n", radius, area );

% 10.1f (ссылаясь на первый аргумент: radius) означает, что его длина должна быть 10 символов (т. Е. Пробел с пробелами), и вывести его как число с плавающей запятой с одним десятичным знаком.

% 10.2 (ссылаясь на второй аргумент: area) означает, что его длина должна быть 10 символов (как указано выше) и печататься с двумя десятичными знаками.

15
20.08.2008 13:50:05
man 3 printf

в системе Linux предоставит вам всю необходимую информацию. Вы также можете найти эти справочные страницы в Интернете, например, по адресу http://linux.die.net/man/3/printf.

7
20.08.2008 13:48:14

10.1f означает , что вы хотите , чтобы отобразить ф loat с 1 десятичным и отображаемое количество должно быть 10 символов.

0
20.08.2008 13:50:37

Короче говоря, эти значения после% говорят о printfтом, как интерпретировать (или вывести) все переменные, которые появятся позже. В вашем примере radiusинтерпретируется как число с плавающей точкой (это 'f'), и 10.1дает информацию о том, сколько десятичных знаков использовать при распечатке.

Смотрите эту ссылку для получения более подробной информации обо всех модификаторах, которые вы можете использовать с printf.

1
20.08.2008 13:51:18

Справочные страницы содержат информацию, которую вы хотите. Чтобы прочитать то, что у вас есть выше:

printf( "%10.2f", 1.5 )

Это напечатает:

         1.50

В то время как:

printf("%.2f", 1.5 )

Печать:

1.50

Обратите внимание на обоснование обоих. Так же:

printf("%10.1f", 1.5 )

Будет печатать:

        1.5

Любое число после. это точность, которую вы хотите напечатать. Любое число до. это расстояние от левого поля.

0
20.08.2008 13:51:59

10.1f означает с плавающей точкой шириной 10 символов и 1 место после десятичной точки. Если номер содержит менее 10 цифр, он дополняется пробелами. 10.2f - то же самое, но с двумя знаками после запятой.

У вас есть эти основные типы:

%d   - integer
%x   - hex integer
%s   - string
%c   - char (only one)
%f   - floating point (float)
%d   - signed int (decimal)
%i   - signed int (integer) (same as decimal).
%u   - unsigned int
%ld  - long (signed) int
%lu  - long unsigned int
%lld - long long (signed) int
%llu - long long unsigned int

Изменить: в ответе @ Eli есть несколько других (man 3 printf).

2
3.05.2015 23:45:59

10.1f означает число с плавающей запятой, где 1 знак после запятой и 10 знаков после запятой. Если номер содержит менее 10 цифр, он дополняется пробелами. 10.2f - то же самое, но с двумя знаками после запятой.

На всех системах, которые я видел, от Unix до Rails Migrations, это не так. @robintw выражает это лучше всего:

В основном в простой форме это% [ширина]. [Точность] [тип].

То есть, не «10 мест до десятичной точки» , но «10 мест, как до , так и после, и в том числе десятичной точки.»

2
20.08.2008 15:17:26
Поведение ширины одинаково для всех спецификаторов формата: это минимальная общая ширина всего отформатированного поля. Ограниченная ширина никогда не приведет к усечению. С другой стороны, точность имеет разные значения с разными типами (строки против чисел с плавающей запятой против целых чисел) и может привести к усечению во всех случаях, кроме целых.
R.. GitHub STOP HELPING ICE 12.08.2010 14:20:15

Одна проблема, которая не была поднята другими, состоит в том, является ли double одинаковым с плавающей точкой . В некоторых системах для удвоения необходим другой спецификатор формата по сравнению с плавающей точкой. Не в последнюю очередь потому, что передаваемые параметры могут быть разных размеров.

 % f - плавать
 % lf - двойной
 % г - двойной

-1
23.08.2008 11:00:49
Неа. Так printfкак это функция с переменным числом аргументов, она подвергается продвижению по умолчанию для типов аргументов, что означает невозможность передачи float. Любой floatаргумент будет повышен doubleдо его передачи. И либо %fили %lfвсегда будет работать. Кроме того, %fvs не %gимеет ничего общего с типом аргумента, но с тем, как вы хотите его отформатировать.
R.. GitHub STOP HELPING ICE 12.08.2010 14:21:36