【问题标题】:padding with sprintf用 sprintf 填充
【发布时间】:2011-09-01 07:11:17
【问题描述】:

我有一个愚蠢的问题。我想用 0 将整数打印到缓冲区填充中,但我无法将其排序为 sprintfformat。 我正在尝试以下方法

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

希望有以下字符串

"000000000000000000000000000324"

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

【问题讨论】:

    标签: c++ c string printf


    【解决方案1】:

    试试:

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

    【讨论】:

    • 您可能已经知道这一点,但是使用 snprintf 样式函数指定缓冲区长度是一个很好的习惯,因为它有助于防止缓冲区溢出。
    【解决方案2】:

    "%030d" 是你要找的机器人

    【讨论】:

    • "您要查找的机器人在手册中。它们被称为宽度和精度。" :-)
    【解决方案3】:

    内边距和宽度在类型说明符之前:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          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".
          

          【讨论】:

          • 当my_val 已经是int 时,为什么还要将int 转换为int?
          【解决方案7】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-15
            • 2015-04-28
            • 2015-08-07
            相关资源
            最近更新 更多