【问题标题】:Setting count of decimal digits in printf at runtime in C language用 C 语言在运行时设置 printf 中的小数位数
【发布时间】:2020-05-20 18:46:19
【问题描述】:

我有一个号码:m,由用户作为参数给出。
例如:

m = 5 

m = 7 

我在运行时不知道这一点。
然后我计算一个积分并将其保存到一个变量中:answer
我想用m 小数位打印answer
我怎样才能做到这一点? 我试过这个:

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

这是错误的,我知道,但是我该如何解决呢?

【问题讨论】:

  • 请展示一个示例,说明输入的内容以及您想看到的内容。包括输入值的类型。
  • printf("answer = %.*f", m, answer);
  • ismick 的评论应该是一个答案,并且比下面的答案更好。这是从参数中获取精度的符合 C99 的版本。有一个 SUS(“单一 UNIX 规范”)变体,允许按数字选择参数,但它不在 C99 中,而且看起来更复杂。

标签: c printf integral


【解决方案1】:

如果你有一个带值的变量,说:

 double val = 3.234003467;  

您可以打印到小数点后第二位,例如使用:

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

它会输出:3.23

This page 列出了几个有用的格式说明符,以及如何/何时使用它们。

这是一个使用命令行输入创建格式字符串并打印出浮点数的完整示例,其中包含用户确定的宽度说明符:

给定以下命令行输入:
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;
}
    

输出将是:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多