C-(Printf)强制显示零

C-(Printf)强制显示零,c,matrix,printf,C,Matrix,Printf,我有: void pprint_matrix(matrix *m) { int n,k,p; matrix* row = new_matrix(1,m->j); for (k = 1; k < (m->i)+1; k++) { p = 0; for (n = (m->j)*k-(m->j); n < (m->j)*k; n++) { row->

我有:

void pprint_matrix(matrix *m)
{
    int n,k,p;
    matrix* row = new_matrix(1,m->j);

    for (k = 1; k < (m->i)+1; k++)
    {
        p = 0;
        for (n = (m->j)*k-(m->j); n < (m->j)*k; n++)
        {
            row->m[p] = m->m[n];
            p++;
        }
        for (n = 0; n < m->j; n++)
        {
            printf("(%+#3.3g%+#3.3gi)  ",row->m[n].re,row->m[n].im);
        }
        printf("\n");
    }
}
打印输出的另一个示例:

(-2.24+0.00i)  (+2.22e-16+0.00i)  (-1.12+0.00i)  (-1.79+0.00i)  
(+0.00+0.00i)  (+1.58+0.00i)  (+0.00+0.00i)  (+0.632+0.00i)  
(+0.00+0.00i)  (+5.55e-17+0.00i)  (-0.725+0.00i)  (-1.04+0.00i)  
(+0.00+0.00i)  (+2.22e-16+0.00i)  (-0.589+0.00i)  (-0.816+0.00i)  
(+0.00+0.00i)  (+2.22e-16+0.00i)  (+0.0467+0.00i)  (+0.404+0.00i)  
我想去掉那个偏移量。在前面的代码中,我如何强制此对齐?我列出的函数对这个问题并不重要。这只是一个关于printf的问题

为明确起见,目标如下:

(  ) (  ) (  )
(  ) (  ) (  )
(  ) (  ) (  )

使用
%3.3f
而不是
%3.3g

我假设您的问题是希望输出具有常量,以便结果形成对齐的列

首先,使用
%f
而不是
%g
来摆脱小数字的指数表示法


第二,增加宽度<代码>%+#3.3f要求小数点右侧有三位数字,加上前导符号,以此类推,如果结果少于三个字符,请在左侧填充空格。例如,如果改为使用
%+#7.3f
,则更有可能对齐列。

如果您只想使用更多填充来形成列,可以尝试:

printf("(%+#8.3g%+#8.3gi)  ",row->m[n].re,row->m[n].im);
如果要填充0,只需将0添加到格式:

printf("(%+0#8.3g%+0#8.3gi)  ",row->m[n].re,row->m[n].im);

另一种可能是使用
sprintf
(或者最好是
snprintf
)将每个条目格式化为字符串,然后使用
%-12s
或任何适当的长度打印字符串


或者,如果您总是希望使用科学记数法,请使用
%..e

对于这些示例,您希望的输出是什么样子的?括号中没有偏移量…您所说的“偏移量”是什么意思?每个括号都应该接触它下面的括号。应该形成列。有时我想知道我的值是否与一个非常小的数字相同f不适合这样做,因为科学记数法确实提出了这个问题。然后使用
%3.3e
<代码>%e始终为您提供科学的符号<代码>%f从不这样做<代码>%g是否可以使用它,取决于值。如果希望得到一致的结果,请不要使用
%g
。增加列填充是有效的。为了清楚起见,printf((((++8.3g%++8.3gi)”,row->m[n].re,row->m[n].im);
printf("(%+0#8.3g%+0#8.3gi)  ",row->m[n].re,row->m[n].im);