【问题标题】:Variable sized padding in printfprintf 中的可变大小填充
【发布时间】:2011-05-07 04:58:50
【问题描述】:

有没有办法在printf 中设置可变大小的填充?

我有一个整数表示填充有多大:

void foo(int paddingSize) {
    printf("%...MyText", paddingSize);
}

这应该打印出### MyText,其中 paddingSize 应该决定“#”符号的数量。

【问题讨论】:

    标签: c formatting printf


    【解决方案1】:

    是的,如果您在格式字符串中使用*,它会从参数中获取一个数字:

    printf ("%0*d\n", 3, 5);
    

    将打印“005”。

    请记住,您只能使用空格或零填充。如果你想用其他东西填充,你可以使用类似的东西:

    #include <stdio.h>
    #include <string.h>
    int main (void) {
        char *s = "MyText";
        unsigned int sz = 9;
        char *pad = "########################################";
        printf ("%.*s%s\n", (sz < strlen(s)) ? 0 : sz - strlen(s), pad, s);
    }
    

    sz 为9 时输出###MyText,或者当sz 为2 时输出MyText(无填充但无截断)。您可能需要检查 pad 是否太短。

    【讨论】:

    • 抱歉,@Debanjan,我错过了* 字符之一。新版本已经过更彻底的检查。
    • 为什么 char *pad, 必须这么长?我的意思是它不受最终输出字符串长度的限制
    【解决方案2】:

    你可以这样写:

    void foo(int paddingSize) {
           printf ("%*s",paddingSize,"MyText");
    }
    

    【讨论】:

      【解决方案3】:
      printf( "%.*s", paddingSize, string );
      

      例如:

      const char *string = "12345678901234567890";
      printf( "5:%.*s\n", 5, string );
      printf( "8:%.*s\n", 8, string );
      printf( "25:%.*s\n", 25, string );
      

      显示:

      5:12345
      8:12345678
      25:12345678901234567890
      

      【讨论】:

        【解决方案4】:

        但要小心 - 至少某些编译器(这可能是通用的 C 语言)不会总是按照您的意愿行事:

        char *s = "four";
        printf("%*.s\n", 5, s); // Note the "."
        

        这会打印 5 个空格;

        char *s = "four";
        printf("%*s\n", 3, s);  // Note no "."
        

        这会打印所有四个字符“四”

        【讨论】:

          【解决方案5】:

          更好地使用 std::cout

          using namespace std;
          cout << setw(9)                       //set output width
               << setfill('#')                  // set fill character
               << setiosflags(ios_base::right)  //put padding to the left
               << "MyText";
          

          应该产生:

          ###MyText
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-02-25
            • 1970-01-01
            • 1970-01-01
            • 2020-07-19
            相关资源
            最近更新 更多