用 sprintf 填充

发布于 2024-11-09 05:03:53 字数 272 浏览 0 评论 0原文

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

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

希望有以下字符串

"000000000000000000000000000324"

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

I have a dummy question. I would like to print an integer into a buffer padding with 0 but I cannot sort it out the sprintfformat.
I am trying the following

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

hoping to have the following string

"000000000000000000000000000324"

what am I doing wrong? It doesn't mean pad with 0 for a max width of 30 chars?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

爱,才寂寞 2024-11-16 05:03:53

“%030d”是您要找的机器人

"%030d" is the droid you are looking for

手心的海 2024-11-16 05:03:53

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

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

来自 Wikipedia 关于 Printf 的文章

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

You got the syntax slightly wrong; The following code produces the desired output:

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

From Wikipedia's Article on Printf:

[...] printf("%2d", 3) results in " 3", while printf("%02d", 3) results in "03".
爱殇璃 2024-11-16 05:03:53

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

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

The padding and width come before the type specifier:

sprintf( buf, "%030d", my_val );
勿忘初心 2024-11-16 05:03:53

尝试:

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

Try:

sprintf( buf, "%030d", my_val );
瑶笙 2024-11-16 05:03:53

您的精度和宽度参数需要位于“%”和转换说明符“d”之间,而不是之后。事实上所有标志都是如此。因此,如果您想要前面的“+”表示正数,请使用“%+d”。

Your precision and width parameters need to go between the '%' and the conversion specifier 'd', not after. In fact all flags do. So if you want a preceeding '+' for positive numbers, use '%+d'.

百变从容 2024-11-16 05:03:53

它是 %030d,末尾带有类型字母。

It's %030d, with type-letter at the end.

放赐 2024-11-16 05:03:53

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

#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 快数百倍。

A fairly effective version that doesn't need any slow library calls:

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

This can be optimized further, though it is still probably some hundred times faster than sprintf as is.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文