【问题标题】:C - (Printf) Forcing Display of ZerosC - (Printf) 强制显示零
【发布时间】:2011-08-11 18:39:23
【问题描述】:

我有:

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");
    }
}

正在打印的内容:

(-1.73+0.00i)  (+0.866+0.00i)  (-0.722+0.00i)  (-0.866+0.00i)  
(+0.00+0.00i)  (-0.707+0.00i)  (+0.707+0.00i)  (+0.707+0.00i)  
(+0.00+0.00i)  (+0.00+0.00i)  (+0.204+0.00i)  (+0.00+0.00i) 

另一个打印输出示例:

(-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的问题。

为了清楚起见,目标是这样的:

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

【问题讨论】:

  • 对于这些示例,您希望的输出是什么样的?
  • 括号中没有偏移量...
  • “偏移”是什么意思?
  • 每个括号都应该触及它下面的括号。应该形成列。

标签: c matrix printf


【解决方案1】:

使用%3.3f 代替%3.3g

【讨论】:

  • 有时我想知道我的值是否完全为零而不是非常小的数字。 %f 对此并不好,因为科学记数法确实会引发这个问题。
  • 然后使用%3.3e%e 总是给你科学记数法; %f 从来没有。 %g 可以使用或不使用,取决于值。如果您想要一致的结果,请不要使用%g
【解决方案2】:

我假设您的问题是您希望输出保持不变,以便结果形成对齐的列。

首先,使用%f 而不是%g 来摆脱小数字的指数符号。

第二,增加宽度。 %+#3.3f要求小数点右边三位,加上前导符号,以此类推,and如果结果小于三个 字符。例如,如果您改用 %+#7.3f,则更有可能获得对齐的列。

【讨论】:

    【解决方案3】:

    如果你只是想要更多的填充来形成列,你可以尝试:

    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);
    

    【讨论】:

    • 增加列填充有效。要清楚, printf("(%+#8.3g%+#8.3gi) ",row->m[n].re,row->m[n].im);
    【解决方案4】:

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

    如果您总是需要科学记数法,请使用 %...e... 不是文字)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 2018-09-02
      • 2016-01-07
      相关资源
      最近更新 更多