Как распечатать тире или точку, используя fprintf / printf? - PullRequest
8 голосов
/ 16 января 2009

На данный момент я использую нижнюю строку для печати без точек

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 ]

10 голосов
/ 16 января 2009

Более быстрый подход:

Если максимальное количество отступов, которое вам когда-либо понадобится, известно заранее (что обычно имеет место при форматировании таблицы с фиксированной шириной, такой как у вас), вы можете использовать статический «отступ» нить и просто взять кусок из этого. Это будет быстрее, чем вызывать 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);
9 голосов
/ 16 января 2009

Вы можете легко сделать это с помощью 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 голосов
/ 16 января 2009

Вы не можете сделать это в одном утверждении. Вы можете использовать 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);

Edit: Упрощенный мой пример выше на основе концепции паддера @Ates. Этот способ не требует каких-либо «прыжков веры» в отношении того, является ли строка тега слишком большой или слишком маленькой - он всегда начинает данные в столбце 41.

2 голосов
/ 16 января 2009

Другое решение с использованием крошечной вспомогательной функции

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

По сути, это то, что написал Атес, но на самом деле я понял это самостоятельно;)

2 голосов
/ 16 января 2009

Вы должны будете самостоятельно вывести строку с точкой или тире.

Что-то вроде (прости мой C, он ржавый):

printAmount(char *txt, int amt) {
    printf("%s",txt);
    for(int xa=strlen(txt); xa<40; xa++) { putc('.'); }
    printf("[%d]",amt);
    printf("\n");
    }
1 голос
/ 16 января 2009

Я бы предложил написать функцию, которая дополняет строку символами X, и использовать ее для генерации первого аргумента вашей строки printf. Что-то вроде:

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

Обратите внимание, что для третьей строки данных вашего примера потребуется этот формат:

"%-40s[%s]"
0 голосов
/ 17 января 2009

Я думаю, что есть лучший способ.

#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 "));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...