Спецификаторы формата в 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); 
}
Другие вопросы по тегам