Это полезно, если вы хотите отделить выделение от инициализации. STL использует новое размещение для создания элементов контейнера.
C11 7.21.6.2p3 говорит следующее из fscanf
и др.:
3 [...] Каждая спецификация преобразования вводится символом
%
, После%
в последовательности появляется следующее:blockquote>
- Необязательный символ подавления присвоения
*
.- Необязательное десятичное целое число, большее нуля, которое задает максимальную ширину поля (в символах).
- Необязательный модификатор длины, который определяет размер принимающего объекта.
- Символ спецификатора преобразования, который указывает тип преобразования, которое будет применено.
Модификатор длины означает дополнительную букву (буквы), например
l
в%lf
, что означаетdouble
. Обратите внимание, что хотя%2f
будет действительным и будет означать, что можно использовать только до 2 символов ввода, нигде не сказано, что вы можете написать%.2f
, т. Е.%.2f
является неверной спецификацией преобразования, и, следовательно, поведение undefined ( C11 7.2.6.2p13 ).
Если нет причин, по которым вы хотите использовать% .2f для сканирования, сработает только использование% f
#include <stdio.h>
#include <conio.h>
#define PI 3.14
int main() {
float r,a,c;
printf("enter radius: \n");
scanf("%f",&r);
c = r * PI * 2;
a = r * r * PI;
printf("area:%.2f circumference:%.2f \n",c,a );
return 0;
}
Пример:
daniel@daniel-FX503VM:~/Documents/test$ ./zero
enter radius:
1
area:6.28 circumference:3.14
.2 в printf спецификатор формата печати, и он не должен влиять на scanf
Когда вы помещаете .2 в scanf, на самом деле это поле ширины, которое указывает максимальное количество символов, которые нужно прочитать в текущая операция чтения (опционально). Однако в этом контексте .2 символа в качестве ширины не имеют смысла, поскольку ширина должна быть целым числом.
Если на самом деле вы пытаетесь прочитать только 2 символа, вы можете сказать
scanf("%2f", &r);
Но имейте в виду, что «.» также будет считаться как символ. Если вы просто хотите, чтобы выходные данные были двумя десятичными знаками, то предложенного выше кода должно быть достаточно. Если вы хотите округлить его внутри, я бы посоветовал вам прочитать этот пост