下面我试图设置一个格式说明符,但每次调用该函数时我都想做不同的操作。关键是打印浮点数Data_Ave。在一个实例中,我想要说明符%2.3f,因此我将为sig_figs_before传递函数a 2,为sig_figs_after传递3。在下一个例子中,我想要%1.4f,所以我会通过那些整数。
char * Send_Data(float Data[10], const char* SUBJECT_SEND_NAME, char *Data_Backup, int sig_figs_before, int sig_figs_after)
{
float Data_Ave = ((Data[0] + Data[1] + Data[2] + Data[3] + Data[4] +
Data[5] + Data[6] + Data[7] + Data[8] + Data[9])/10);
sprintf(msgBody,"%%i.%if, ", before_decimal, after_decimal, Data_Ave);
... //Some more code
}
我很确定这不起作用,所以我想把浮动分成两个整数并按照这样打印:
sprintf(msgBody,"%i.%i, ", int_value, decimal_value);
但我不知道如何正确拆分浮子。 有什么建议吗?
答案 0 :(得分:5)
你想:
sprintf(msgBody,"%*.*f, ", before_decimal+after_decimal+1, after_decimal, Data_Ave);
请注意,您可以使用*
通过整数参数指定宽度。另请注意,在%N.Mf
格式中,N
是打印数字的总大小(包括小数,点,符号,指数,填充等),M
是小数精度。这就是为什么,在您的情况下,第一个数字应仅为before_decimal+after_decimal+1
而不是before_decimal
。
答案 1 :(得分:2)
您可以使用sprintf
两次获得所需的结果 - 一次获取格式字符串,然后再次获取实际结果。
sprintf(format, "%%%i.%if", before_decimal, after_decimal);
sprintf(msgBody, format, Data_Ave);
第一行将写入,例如(2和3)%2.3f
进入format
;第二行将对该格式字符串进行操作以写入msgBody
。
您还应该考虑使用snprintf
代替sprintf
,尤其是因为您使用的是可变长度的字符串 - 不想导致buffer overflow!
答案 2 :(得分:0)
sprintf()
未提供“之前的重要数据”。
它提供最小字段宽度,可以从sig_figs_before
,sig_figs_after
和值本身派生。
char * Send_Data(float Data[10], const char* SUBJECT_SEND_NAME,
char *Data_Backup, int sig_figs_before, int sig_figs_after) {
assert(sig_figs_before >= 1);
assert(sig_figs_after >= 0);
float Data_Ave = ((Data[0] + Data[1] + Data[2] + Data[3] + Data[4] +
Data[5] + Data[6] + Data[7] + Data[8] + Data[9])/10);
int width = sig_figs_before + 1 + sig_figs_after; // +1 for '.'
// Make room for '-'
if (Data_Ave < 0) width++;
sprintf(msgBody, "%#*.*f, ", width, sig_figs_after, Data_Ave);
}
'#'
应该sig_figs_after == 0
用于保留小数点。
注意:这不是限制宽度或sig_figs_before
应该Data_Ave
的数量。 @Matt Patenaude使用snprintf()
的想法很好。
黑客的方法是测试:
if (log10(fabs(Data_Ave)+0.5) > sig_figs_before) UseAlternativePrint();