用sprintf填充

时间:2011-05-24 21:16:19

标签: c++ c string printf

我有一个虚假的问题。我想将一个整数打印到带有0的缓冲区填充中,但我无法将其排序为sprintf格式。 我正在尝试以下

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

希望有以下字符串

"000000000000000000000000000324"
我做错了什么?它不代表填充0,最大宽度为30个字符?

7 个答案:

答案 0 :(得分:66)

"%030d"是您正在寻找的机器人

答案 1 :(得分:7)

填充和宽度来自之前类型说明符:

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

答案 2 :(得分:7)

你的语法略有错误;以下代码生成所需的输出:

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

来自Wikipedia's Article on Printf

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

答案 3 :(得分:5)

尝试:

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

答案 4 :(得分:3)

您的精度和宽度参数需要介于'%'和转换说明符'd'之间,而不是之后。实际上所有的旗帜都可以。因此,如果您想要正数前面的“+”,请使用'%+ d'。

答案 5 :(得分:1)

它是%030d,最后带有字母。

答案 6 :(得分:-1)

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

#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] = '\0';
}


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

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