2014-01-03 3 views
0

Это моя первая программа на C, пожалуйста, будьте мягкими парнями.Ошибка компиляции с gcc: warning: format указывает тип 'int *', но аргумент имеет тип 'double *'

Я пытаюсь получить пользовательский ввод для преобразования между температурами, а также использовать коммутационный футляр для расчета преобразованных температур. Моя следующая программа бросает ошибки, как это при попытке скомпилировать его с GCC на Mac:

convertTemp.c:17:20: warning: format specifies type 'int *' but the argument has type 'double *' [-Wformat] 
     scanf ("%d", &Celcius); 
       ~~ ^~~~~~~~ 
       %lf 
convertTemp.c:21:72: warning: format specifies type 'int' but the argument has type 'double' [-Wformat] 
     printf ("The converted temperature of %d in Fahreight is: %d\n", Celcius, Fahr); 
              ~~       ^~~~~~~ 
              %f 
convertTemp.c:21:81: warning: format specifies type 'int' but the argument has type 'double' [-Wformat] 
     printf ("The converted temperature of %d in Fahreight is: %d\n", Celcius, Fahr); 
                   ~~    ^~~~ 
                   %f 
convertTemp.c:25:20: warning: format specifies type 'int *' but the argument has type 'double *' [-Wformat] 
     scanf ("%d", &Fahr); 
       ~~ ^~~~~ 
       %lf 
convertTemp.c:29:70: warning: format specifies type 'int' but the argument has type 'double' [-Wformat] 
     printf ("The converted temperature of %d in Celcius is: %d\n", Fahr, Celcius);  
              ~~      ^~~~ 
              %f 
convertTemp.c:29:76: warning: format specifies type 'int' but the argument has type 'double' [-Wformat] 
     printf ("The converted temperature of %d in Celcius is: %d\n", Fahr, Celcius);  
                   ~~   ^~~~~~~ 
                   %f 
6 warnings generated. 

Код:

#include <stdio.h> 

int main (void) 
{ 
    int choice; 
    double Celcius, Fahr; 

    printf ("Do you want to convert from C to F (1) or from F to C(2))?"); 

    scanf ("%i", &choice); 


    switch(choice) 
    { 
    case 1: 
     printf ("Please type the temp in Celcius"); 
     scanf ("%d", &Celcius); 

     Fahr = (Celcius * 9)/5; 
     Fahr += 32; 
     printf ("The converted temperature of %d in Fahreight is: %d\n", Celcius, Fahr); 

    case 2: 
     printf ("Please type the temp in Fahrenheit"); 
     scanf ("%d", &Fahr); 

     Celcius = (Fahr - 32) * 5; 
     Celcius /= 9; 
     printf ("The converted temperature of %d in Celcius is: %d\n", Fahr, Celcius); 

    } 

    return 0; 

} 
+1

Я не получаю ошибку о неправильном типе возврата на 'main', когда компилирую это в Linux. Вы уверены, что составляете правильный файл? – templatetypedef

+4

Код, который вы показываете, отличается от кода, который видел компилятор. Он видел 'double main (void)'. Пожалуйста, разместите ошибки кода и компиляции, которые точно совпадают. –

+0

обновил сообщение об ошибке. извините – TonyGW

ответ

2

Ваша программа вызывает неопределенное поведение. Использование неверного спецификатора преобразования вызывает UB. Для сканирования double используйте спецификатор %lf (ваше предупреждение о компиляторе уже указывает на это).

scanf ("%lf", &Celcius); 

Образец run.

+0

Где моя зимняя шапка? : '(((( – haccks

+0

Прошло - полночь на 4 января в UTC ... до декабря 2014 года ... –

+0

@JonathanLeffler; О, это годовой, не так ли? (Я не пробовал все). – haccks

3

Для печати дубликатов и поплавков вы можете использовать спецификаторы %g и %f. Вы также должны обрабатывать ситуацию по умолчанию в коммутаторе в случае неправильного ввода пользователя. Возможно, напечатав полезное сообщение об ошибке пользователю.

После каждого оператора switch также рекомендуется, чтобы вы делали break;, чтобы предотвратить выполнение дополнительных операторов case, если это поведение не является предпочтительным.

+0

+1 для указания отсутствующих операторов 'break;'. Обратите внимание, что 'scanf()' формат 'double' -'% lf', но классический формат 'printf()' - '% f' (хотя' printf() 'в C99 и C11 распознает'% lf' как синоним '% f', в большая часть для согласованности с 'scanf()'). –

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