【问题标题】:Getting the formatting right with sprintf()使用 sprintf() 获得正确的格式
【发布时间】:2013-06-19 18:50:23
【问题描述】:

我正在尝试在我的 sprintf 语句中完成一些格式设置,但它似乎没有像我预期的那样工作。这是一行:

n = sprintf(buffer, "x = %d.%d, y = %d.%d, z = %d.%d \n", x1, x2, y1, y2, z1, z2);

在打印输出中,x1 是数字的整数部分,x2 是小数部分。一切都会好的,除了我需要将 x2、y2 和 z2 填充为始终为 2 位数字 - 这意味着我需要用前导零填充。

根据我在网上看到的示例,这样做似乎应该可行:

n = sprintf(buffer, "x = %d.%02d, y = %d.%02d, z = %d.%02d \n", x1, x2, y1, y2, z1, z2);

但是,这会产生类似这样的结果:

x = 2.2d, y = 37.2d, z = 2.2d

上面的 37 实际上是 x2,它显然被转移到了 y1 的位置。我尝试在“02”周围加上括号,但这也无济于事。

我也尝试过像这样分割期间:(但没有奏效)

   n = sprintf(buffer, "x = %d. %02d, y = %d. %02d, z = %d. %02d \n", x1, x2, y1, y2, z1, z2);

我不太确定出了什么问题...如果有任何帮助,我将不胜感激。这在 sprintf 中并不是特别重要(理论上我可以写一些“if”语句并让它以这种方式工作),但这会很好。

谢谢!

【问题讨论】:

  • 在这里正常工作。您是否可能不小心在转换中输入了O 而不是0? [牵强,我知道]
  • @DanielFischer,这些是从我的代码中复制粘贴的,我认为它们是 0。不过我再次检查了:P 我为此设计了一个快速替换功能,但我很想知道为什么这无论如何都不起作用。
  • 好的,如果这是复制粘贴,那么您的格式是正确的。它可以从这里复制粘贴,正如目视检查所说的那样。那么,您使用的是什么编译器(和库实现)?看起来好像它没有实现所有标志。出于好奇,它与%d.%2d 有什么关系?它是空格键吗?
  • %d.%2d 给了我x = -3.d, y = 59.d, z = -7.d,再次移动 x2。 (这是我实际测量的加速度,但我大致知道什么值应该在哪里)。我拥有的编译器是来自 Code Composer Studio 5 的 TI v4.1.5。我不知道如何检查库实现:( 看着 here 虽然似乎有一个选项可以打开完整的 printf() 支持,即应该是默认的。我现在不太清楚,但我正在寻找。
  • “注释”确实说,对于 MSP430,在 CCS v4 中创建新项目时,此选项默认设置为“最小”以避免大量 RAM 需求。 “最小”支持避开了与您看到的输出一致的宽度和精度标志。试试--printf_support=nofloat 看看是否有帮助。

标签: c io printf code-composer


【解决方案1】:

这是一个示例代码和输出。

float x1 = 10.12222;
float y1 = 20.23333;
float z1 = 30.34444;
int   xi = 10;
int   yi = 20;
int   zi = 30;
int   x0 = 5;
int   y0 = 5;
int   z0 = 5;
int   xl = 10;
int   yl = 10;
int   zl = 10;
char  chr[512];

printf("x = %5.2f, y = %5.2f, z = %5.2f\n", x1, y1, z1);
printf("x = %10d, y = %10d, z = %10d\n", xi, yi, zi);
printf("x = %010d, y = %010d, z = %010d\n", xi, yi, zi);
printf("x = %-10d, y = %-10d, z = %-10d\n", xi, yi, zi);
printf("x = %10.5d, y = %10.5d, z = %10.5d\n", xi, yi, zi); // DYNAMIC

/* Dynamic formatting of DYNAMIC commented line*/
sprintf(chr, "Dynamic: x = %%%d.%dd, y = %%%d.%dd, z = %%%d.%dd\n",
        xl, x0, yl, y0, zl, z0);
printf(chr, xi, yi, zi);

输出会是这样的。

x = 10.12, y = 20.23, z = 30.34
x =         10, y =         20, z =         30
x = 0000000010, y = 0000000020, z = 0000000030
x = 10        , y = 20        , z = 30
x =      00010, y =      00020, z =      00030
Dynamic: x =      00010, y =      00020, z =      00030

%x.yd 表示,

x - 整数的总字符数。

y - 在该长度内用 0 填充。

%10.5d 将针对 10、100、1000、10000、100000、100000 给出以下结果

bbbbbbbbbb => Spaces
     00010
     00100
     01000
     10000
    100000
   1000000

我希望这对您的格式化有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 2016-05-11
    • 1970-01-01
    • 2020-11-06
    • 2012-05-27
    • 2021-05-11
    相关资源
    最近更新 更多