Установка количества десятичных цифр в printf во время выполнения на языке C

У меня есть номер: m, который задается пользователем в качестве параметра.
Например:

m = 5 

or

m = 7 

Я не знаю этого во время выполнения.
Затем я вычисляю интеграл и сохраняю его в переменной: answer.
Я хочу напечатать answer с m десятичными цифрами.
Как мне это сделать. это? Я пробовал вот это:

printf("answer = %(%.mf)d ", answer , m);

Я знаю, что это неправильно, но как я могу это решить?


person Nick_Gkoutzas    schedule 20.05.2020    source источник
comment
Пожалуйста, покажите пример того, что входит и что именно вы хотите увидеть. Включая тип входного значения.   -  person Weather Vane    schedule 20.05.2020
comment
Комментарий ismick должен быть ответом, и это лучший ответ, чем приведенный ниже. Это совместимая с C99 версия получения точности от аргумента. Существует вариант SUS (Single UNIX Specification), который позволяет выбирать аргументы по номеру, но его нет в C99, и он выглядит более сложным.   -  person Thomas Kammeyer    schedule 03.08.2020


Ответы (1)


Если у вас есть переменная со значением, скажите:

 double val = 3.234003467;  

Вы можете распечатать до второго десятичного знака, например, используя:

printf("This is the value: %0.2f\n", val);

Будет выведено: 3.23

На этой странице перечислены несколько полезных спецификаторов форматирования, и как и когда их использовать.

Вот полный пример использования ввода командной строки для создания строки формата и печати с плавающей запятой с определяемым пользователем спецификатором ширины:

Учитывая следующий ввод командной строки:
prog.exe 1.123423452345 4
с использованием следующего кода:

#define TRUE 1
#define FALSE 0
#define bool BOOL

    bool parseDbl(const char *str, double *val);
    bool parseLong(const char *str, long *val);

    int main(int argc, char *argv[])//Use this signature rather than 
    {                               //int main(void) to allow user input
        if(argc != 3) //simple verification that command line contains 2 arguments
        {
            ;   
        }
        double dVal;
        long iVal;
        char format_string[80];
        
        if(parseDbl(argv[1], &dVal));//to simplify code, move the conversions to functions
        if(parseLong(argv[2], &iVal));
        
        //create the format string using inputs from user
        sprintf(format_string, "%s %s%d%s", "User input to \%d decimal Places:  ", "%0.", iVal, "f");
        
        printf(format_string, iVal, dVal);//use format string with user inputs
            
        return 0;
    }
    
bool parseDbl(const char *str, double *val)
{
    char *temp = NULL;
    bool rc = TRUE;
    errno = 0;
    *val = strtod(str, &temp);

    if (temp == str || ((*val == -HUGE_VAL || *val == HUGE_VAL) && errno == ERANGE))
        rc = FALSE;

        return rc;
}
    
bool parseLong(const char *str, long *val)
{
    char *temp;
    bool rc = TRUE;
    errno = 0;
    *val = strtol(str, &temp, 0);

    if (temp == str || errno == ERANGE)
        rc = FALSE;

    return rc;
}
    

Результатом будет:
 введите описание изображения здесь

person ryyker    schedule 20.05.2020