предупреждение: формат ‘%f’ ожидает аргумент типа «float ’, но аргумент 2 имеет тип» double ’

#c #double #scanf #conversion-specifier

#c #двойной #сканф #спецификатор преобразования

Вопрос:

каждый. МНЕ НУЖНА ПОМОЩЬ! Я пытался представить следующую задачу ХакеррАнка : Задание Учитывая цену еды (базовую стоимость еды), процент чаевых (процент от цены еды, добавляемой в качестве чаевых) и налоговый процент (процент от цены еды, добавляемой в качестве налога) за еду, найдите и распечатайте общую стоимость еды. Округлите результат до ближайшего целого числа.

 #include lt;stdio.hgt; #include lt;math.hgt; int main()  {  int tax,tip;  double mealc;   scanf("%f",amp;mealc); scanf("d",amp;tip); scanf("%d",amp;tax); mealc = mealc (mealc*tip/100)) (mealc*tax/100); printf ("%d",round(mealc));   return 0; }   

После компиляции приведенного выше кода. Я всегда получаю эти ошибки :

 Hk2.c:33:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double *’ [-Wformat=]  Hk2.c:37:11: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat=]  

В чем проблема ?

Комментарии:

1. Почему вы думаете, что scanf("%f",amp;mealc) это правильно, и что, по вашему мнению, пытается сказать вам предупреждающее сообщение?

2. %f форматирует float тип, следовательно, аргументы, которые вам нужно передать scanf , должны быть с плавающей точкой

3. Просто используйте %lf в обоих случаях.

4. scanf("d",amp;tip); вы забыли о %

5. Вы были правы , что использовали тип double ; в большинстве случаев это предпочтительнее (чем использовать float , что часто бывает слишком неточным). Так что одобряйте комментарий Вильяма Перселла и игнорируйте комментарии Rafaelplayerxd и Цацики.

Ответ №1:

Измените питание на плавающее. При втором сканировании вы пропустили %: scanf(«%d»,amp;подсказка);

Ответ №2:

Как говорится в предупреждающем сообщении, спецификатор преобразования %f предназначен для ввода значений для объектов типа float , а не типа double .

Чтобы ввести значение для объекта данного типа double , вам необходимо использовать спецификатор преобразования %lf .

 scanf("%lf",amp;mealc);  

Также у вас есть опечатка в этом вызове

 scanf("d",amp;tip);  

тебе нужно написать

 scanf("%d",amp;tip);  

И в этом заявлении

 mealc = mealc (mealc*tip/100)) (mealc*tax/100);  

существует избыточная закрывающая скобка. Тебе нужно написать

 mealc = mealc (mealc*tip/100) (mealc*tax/100);  

Комментарии:

1. ` #включают lt;stdio.hgt; #включают lt;math.hgt; int основной() { int и налоговые,чаевые; двойной mealc; то scanf(«%ЛФ»,amp;mealc); то scanf(«%D»может, и подсказка); то scanf(«%D», поamp;налогов); mealc = mealc (mealc совет/100) (mealc налога/100); Е («%F»,которые круглые(mealc)); возвращать 0; } ` Да, он работал нормально, но результат типа float. Когда я меняю тип, я получаю ту же ошибку.

2. Если вас беспокоит последняя распечатка, содержащая десятичную точку , либо используйте %.0f , либо, возможно %d , вместе с (int)round(mealc) ней .

3. Спасибо, это сработало..

4. В чем разница между "%f" и "%lf" ?

5. @Циклон, используемый с функцией scanf, спецификатор преобразования %f ожидает указатель на объект типа float, в то время как спецификатор преобразования %lf ожидает указатель на объект типа double.