Спецификаторы формата в C
#include<conio.h>
#include<stdio.h>
main()
{
printf("%d %f ", 4.0, 4.0);
getch();
}
Я получаю вывод как 0 4.000000
, Я хочу знать точную причину.
2 ответа
Основная причина в том, что вы неправильно используете спецификаторы формата...
Когда вы делаете это:
printf("%d %f ",4.0,4.0f);
вы говорите своему компилятору, что вы печатаете целое число и число с плавающей запятой, вместо этого вы передаете 2 числа с плавающей запятой, поэтому компилятор не является абелом для приведения числа с плавающей точкой к int
сделать инстад
printf("%d %f ",(int)4.0,4.0f);
Более подробная информация о спецификаторах формата.
Обычный тип переменной Display
% c символ одиночный символ
%d (%i) int целое число со знаком
%e (%E) формат с плавающей запятой или двойная экспонента
% f float
% lf double
% g (% G) плавание или двойное использование% f или% e, как требуется
% o int беззнаковое восьмеричное значение
Адрес указателя% p хранится в указателе
% s массив последовательности символов
% u int без знака
%x (%X) int шестнадцатеричное значение без знака
printf
Функция не знает, какой тип данных ожидать в списке переменных аргументов, если вы не укажете, что там. Вот для чего предназначена часть данных спецификатора формата.
Что происходит для вас, вы сказали, что первый аргумент int
, но тогда вы дали ему другой тип данных. Результат не определен.
Если вы хотите увидеть тип вещи, которая printf
делает под капотом, а затем читал о функциях с переменным числом в C. Это даст вам лучшее представление о том, почему так важно, чтобы тип, который ожидает функция, соответствовал типу, который вы ей дали.
Чтобы предложить пример кода, взятый из ссылки, которую я только что предоставил:
#include <stdio.h>
#include <stdarg.h>
void simple_printf(const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
while (*fmt != '\0') {
if (*fmt == 'd') {
int i = va_arg(args, int);
printf("%d\n", i);
} else if (*fmt == 'c') {
// note automatic conversion to integral type
int c = va_arg(args, int);
printf("%c\n", c);
} else if (*fmt == 'f') {
double d = va_arg(args, double);
printf("%f\n", d);
}
++fmt;
}
va_end(args);
}
int main(void)
{
simple_printf("dcff", 3, 'a', 1.999, 42.5);
}