расчет в программе на С всегда приводит к 0

Это полезно, если вы хотите отделить выделение от инициализации. STL использует новое размещение для создания элементов контейнера.

0
задан woz 16 January 2019 в 22:46
поделиться

2 ответа

C11 7.21.6.2p3 говорит следующее из fscanf и др.:

3 [...] Каждая спецификация преобразования вводится символом % , После % в последовательности появляется следующее:

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

Модификатор длины означает дополнительную букву (буквы), например l в %lf, что означает double. Обратите внимание, что хотя %2f будет действительным и будет означать, что можно использовать только до 2 символов ввода, нигде не сказано, что вы можете написать %.2f, т. Е. %.2f является неверной спецификацией преобразования, и, следовательно, поведение undefined ( C11 7.2.6.2p13 ).

0
ответ дан Antti Haapala 16 January 2019 в 22:46
поделиться

Если нет причин, по которым вы хотите использовать% .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);

Но имейте в виду, что «.» также будет считаться как символ. Если вы просто хотите, чтобы выходные данные были двумя десятичными знаками, то предложенного выше кода должно быть достаточно. Если вы хотите округлить его внутри, я бы посоветовал вам прочитать этот пост

0
ответ дан Daniel 16 January 2019 в 22:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: