我相信您正在寻找的是一种无需硬编码即可动态更改输出精度的方法。
如果您可以访问 c99 编译器,则可以使用 snprintf 生成格式字符串,例如:
char* format_width(double x, unsigned prec) {
int fmt_size = snprintf (NULL, 0, "%%.%ulf", prec);
char* fmt_string = malloc(fmt_size + 1);
snprintf(fmt_string, fmt_size + 1, "%%.%ulf", prec);
int out_size = snprintf (NULL, 0, fmt_string, x);
char* out_string = malloc(out_size + 1);
snprintf(out_string, out_size + 1, fmt_string, x);
free(fmt_string);
return out_string;
}
用法可能类似于
int main() {
double number;
unsigned prec;
printf("Enter a number: ");
// reads and stores input
scanf("%lf", &number);
printf("Enter precision: ");
// reads and stores precision
scanf("%u", &prec);
char* result = format_width(number, prec);
// displays output
printf("You entered: %s", result);
free(result);
return 0;
}
Demo
优化分配
为了避免过多的分配,可以使用一个合理大小的缓冲区来生成格式说明符。例如,fmt_string 不太可能超过 15 个字符,因此我们可以优化该部分。
也有可能用户已经知道他们可能收到的输入的最大大小,所以我们可以允许他们传入out_string缓冲区(假设它足够大以包含结果)
char* format_width(double x, unsigned prec, char* out_string) {
static char fmt_string[15];
snprintf(fmt_string, 15, "%%.%ulf", prec);
int out_size = snprintf (NULL, 0, fmt_string, x);
snprintf(out_string, out_size + 1, fmt_string, x);
return out_string;
}