代码之家  ›  专栏  ›  技术社区  ›  Thi

如何使用fprintf/printf打印短划线或点?

  •  8
  • Thi  · 技术社区  · 17 年前

    从现在起,我用下面的行打印点

    fprintf( stdout, "%-40s[%d]", tag, data);
    

    我希望输出是如下所示的,

    Number of cards..................................[500]
    Fixed prize amount [in whole dollars]............[10]
    Is this a high winner prize?.....................[yes]
    

    如何使用fprintf/printf打印短划线或点?

    7 回复  |  直到 17 年前
        1
  •  10
  •   Ates Goral    17 年前

    更快的方法:

    如果预先知道您需要的最大填充量(通常情况下,当您格式化一个固定宽度的表(如您所拥有的表),您可以使用一个静态的“padder”字符串并从中获取一个块。这比打电话快 printf cout 在一个循环中

    static const char padder[] = "......................"; // Many chars
    
    size_t title_len = strlen(title);
    size_t pad_amount = sizeof(padder) - 1 - title_len;
    
    printf(title); // Output title
    
    if (pad_amount > 0) {
        printf(padder + title_len); // Chop!
    }
    
    printf("[%d]", data);
    

    你甚至可以在一个声明中,用信仰的飞跃来做到这一点:

    printf("%s%s[%d]", title, padder + strlen(title), data);
    
        2
  •  9
  •   BatchyX    17 年前

    您可以使用iostreams而不是printf轻松完成此操作

    cout << setw(40) << setfill('.') << left << tag[i] << '[' << data[i] << ']' << endl;
    

    或者如果你真的需要使用fprintf(比如,你被传递一个文件*来写入)

    strstream str;
    str << setw(40) << setfill('.') << left << tag[i] << '[' << data[i] << ']' << endl;
    printf(%s", str.str());
    
        3
  •  3
  •   AShelly    17 年前

    你不能一句话就这么做。 您可以使用sprintf,然后自己用点替换空格,或者 类似的东西

    int chars_so_far;
    char padder[40+1]= '..........'; //assume this is 40 dots.
    printf("%.40s%n",tag,&chars_so_far);
    printf("%s[%d]",padder+chars_so_far,data);
    

    编辑: 基于@ates'padder概念简化了上述示例。这种方式不需要任何“信念的飞跃”,不管标签字符串是太大还是太小——它总是从第41列开始数据。

        4
  •  2
  •   L. Cornelius Dol    17 年前

    您将不得不自己输出带有点或破折号填充的字符串。

    比如(原谅我的C,它生锈了):

    printAmount(char *txt, int amt) {
        printf("%s",txt);
        for(int xa=strlen(txt); xa<40; xa++) { putc('.'); }
        printf("[%d]",amt);
        printf("\n");
        }
    
        5
  •  2
  •   Christoph    17 年前

    另一个使用小助手函数的解决方案

    static inline size_t min(size_t a, size_t b)
    {
        return a < b ? a : b;
    }
    

    然后,您可以执行以下操作:

    char padder[] = "........................................";
    int len = min(strlen(tag), sizeof(padder) - 1);
    printf("%.*s%s[%d]", len, tag, padder + len, data);
    

    这基本上就是ATE发布的内容,但实际上我自己解决了这个问题;)

        6
  •  1
  •   Jon Ericson Homunculus Reticulli    17 年前

    我建议编写一个函数,用x字符填充一个字符串,并用它来生成 printf 字符串。类似:

    char s[40];
    pad_str(tag, s, 40, '.');
    fprintf( stdout, "%-40s[%d]", s, data);
    

    请注意,示例数据的第三行需要这种格式:

    "%-40s[%s]"
    
        7
  •  0
  •   nsayer    17 年前

    我觉得有更好的办法。

    #include <string.h>
    #include <stdio.h>
    
    #define MIN(A,B) ((A)<(B)?(A):(B))
    char *dashpad(char *buf, int len, const char *instr) {
        memset(buf, '-', len);
        buf[len] = 0;
        int inlen = strlen(instr);
        memcpy(buf, instr, MIN(len, inlen));
        return buf;
    }
    main() {
        char buf[40];
        printf("%s\n", dashpad(buf, 40, "Hello world, dash padded "));
    }