2016-11-09 4 views
0

Я занимаюсь школьной работой, и я столкнулся с проблемой. Почему я теряю значение переменной n2?Почему я теряю значение переменной n2?

#include <stdio.h> 
#include <stdlib.h> 

int opt; 
double n1; 
double n2; 

int main() 
{ 
    printf("Hello and welcome \n"); 
    printf("Lets do Some math! \n"); 
    printf("Menu!\n"); 
    printf("1- \t Areas \n"); 
    printf("2- \t Perimetros \n"); 
    scanf("%d",&opt); 

    switch (opt){ 
     case 1: 
      Areas(); 
      break; 

     case 2: 
      break; 
    } 
    return 0; 
} 

void Areas(){ 
    printf("Area de:\n"); 
    printf("1- \t Quadrado\n"); 
    printf("2- \t Retangulo\n"); 
    printf("3- \t Losangulo\n"); 
    printf("1- \t Circulo\n"); 
    scanf("%d", &opt); 

    switch (opt){ 
     case 1: 
      Medidas("dos lados."); 
      printf("%d %d\n", n1,n2); 
      break; 

     case 2: 
      break; 
    } 
} 

void Medidas(char string[]){ 
    printf("Introduzir as Medidas %s \n", string); 
    scanf("%d", &n1); 
    printf("Next\n"); 
    scanf("%d", &n2); 
} 

Я пробовал много вещей, и ничего не работает.

printf("%d %d\n", n1,n2); 

предназначен для целей отладки.

+0

Включите предупреждения компилятора. Это должно было поймать 'double n1; scanf ("% d", &n1); ' – chux

ответ

1

Проблема заключается в

scanf("%d", &n1); 
scanf("%d", &n2); 

n1 и n2 имеют тип double, поэтому использование формата %d спецификатор вызывает undefined behavior.

Цитирование C11, глава §7.21.6.2, для fscanf(), (курсив мой )

d
Соответствует необязательно десятичное целое число, чей формат такой же, как ожидается, для объекта последовательности функция strtol со значением 10 для базового аргумента. Соответствующим аргументом должен быть указатель на целое число со знаком.

и

[...] Если подавление присваивания не было обозначено *, то результат преобразования помещается в объект, на который указывает на первый аргумент после формат аргумента который еще не получил результат преобразования. Если этот объект не имеет соответствующего типа, или если результат преобразования не может быть представлен в объекте, поведение не определено.

решение: Для печати double с, вам нужно использовать %f и для сканирования значения, вам нужно использовать %lf.

1

Переменные n1 и n2 имеют тип double. Однако вы используете спецификатор формата %d в printf и scanf, которые ожидают int и указатель на int.

Для чтения/записи в double, используйте формат %f спецификатор для printf и %lf для scanf.

0

Вы используете двойной тип данных для n1 и n2. Спецификатор формата печати для double - %f; формат сканирования - %lf. Вместо %d используйте %f каждый раз за n1 и n2.

+0

Возможно, вам следует уточнить последнее предложение, использование'% f' в вызове 'scanf()' семейства не будет работать с 'n1' как' double', но это нормально для семейства 'printf(). –

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