Как распечатать тире или точку с помощью fprintf /printf?
Вопрос
На данный момент я использую нижеприведенную строку для печати без точек
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?
Решение
Более быстрый подход:
Если максимальное количество отступов, которое вам когда-либо понадобится, известно заранее (что обычно имеет место при форматировании таблицы с фиксированной шириной, такой как у вас), вы можете использовать статический & Quot; padder Quot &; нить и просто взять кусок из этого. Это будет быстрее, чем вызывать 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);
Другие советы
Вы можете легко сделать это с помощью 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());
Вы не можете сделать это в одном заявлении.Вы можете использовать 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);
Редактировать:Упростил мой приведенный выше пример, основанный на концепции padder от @Ates.Этот способ не требует никаких "скачков веры" в то, является ли строка тега слишком большой или слишком маленькой - она всегда запускает данные в столбце 41.
Вы должны будете самостоятельно вывести строку с точкой или тире.
Что-то вроде (простите мой C, он ржавый):
printAmount(char *txt, int amt) {
printf("%s",txt);
for(int xa=strlen(txt); xa<40; xa++) { putc('.'); }
printf("[%d]",amt);
printf("\n");
}
Другое решение с использованием крошечной вспомогательной функции
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);
Это, по сути, то, что написал Атес, но на самом деле я понял это сам;)
Я бы предложил написать функцию, которая дополняет строку символами X, и использовать ее для генерации первого аргумента для вашей строки printf
. Что-то вроде:
char s[40];
pad_str(tag, s, 40, '.');
fprintf( stdout, "%-40s[%d]", s, data);
Обратите внимание, что третья строка данных вашего примера будет нуждаться в этом формате:
"%-40s[%s]"
Я думаю, что есть лучший способ.
#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 "));
}