padding with sprintf

padding with sprintf

本文关键字:sprintf with padding      更新时间:2023-10-16

我有一个伪问题。我想将一个整数打印到缓冲区中,填充0,但我无法按sprintf格式对其进行排序。我正在尝试以下

char buf[31];
int my_val = 324;
sprintf( buf, "%d030", my_val );

希望有以下字符串

"000000000000000000000000000324"

我做错了什么?这不意味着用0填充最大宽度为30个字符吗?

"%030d"是您要查找的机器人

您的语法有点错误;以下代码产生所需的输出:

char buf[31];
int my_val = 324;
sprintf( buf, "%030d", (int)my_val );

来自维基百科关于Printf:的文章

[...] printf("%2d", 3) results in " 3", while printf("%02d", 3) results in "03".

填充和宽度位于类型说明符之前

sprintf( buf, "%030d", my_val );

尝试:

sprintf( buf, "%030d", my_val );

精度和宽度参数需要介于"%"和转换说明符"d"之间,而不是在之后。事实上,所有的标志都是这样。所以,如果你想要正数的前一个"+",请使用"%+d"。

它是%030d,末尾键入letter。

一个相当有效的版本,不需要任何缓慢的库调用:

#include <stdio.h>
void uint_tostr (unsigned int n, size_t buf_size, char dst[buf_size])
{
  const size_t str_size = buf_size-1;
  for(size_t i=0; i<str_size; i++)
  {
    size_t index = str_size - i - 1;
    dst[index] = n%10 + '0';
    n/=10;
  }
  dst[str_size] = '';
}

int main (void)
{
  unsigned int n = 1234;
  char str[6+1];
  uint_tostr(n, 6+1, str);
  puts(str);
}

这可以进一步优化,尽管它可能仍然比sprintf快几百倍。