Как распечатать тире или точку с помощью fprintf/printf?

Я думаю, что предварительный ответ был верным, но нужно провести кастинг, так что попробуйте это

//Deserialize the JSON data

  var notification = JsonConvert.DeserializeObject<Notification>(apiContent); 

    List<Post> posts = new List<Post>();
      if (notification?.posts != null){
        foreach(var item in notification.posts.Values){
           posts.AddRange(item);
         }
       }
    var _schoolNotification = new ObservableCollection<Post>(posts);
8
задан A. Rex 16 January 2009 в 21:31
поделиться

7 ответов

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

Если максимальный объем дополнения этого, в котором Вы будете когда-либо нуждаться, известен заранее (который обычно имеет место, когда Вы форматируете таблицу fixed-width как та, Вы имеете), можно использовать статическую строку "заполнителя" и просто захватить блок из него. Это будет быстрее, чем вызов 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);
10
ответ дан 5 December 2019 в 06:10
поделиться

Можно легко сделать это с 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());
9
ответ дан 5 December 2019 в 06:10
поделиться

Вы не можете сделать этого в одном операторе. Можно использовать 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' понятия заполнителя. Этот путь не требует никаких 'прыжков веры', о том, является ли строка тега слишком большой или слишком маленькой - она всегда запускает данные в столбце 41.

3
ответ дан 5 December 2019 в 06:10
поделиться

Вы оказываетесь перед необходимостью производить строку с точкой или тире, дополняющим себя.

Что-то как (прощают мой C, это ржаво):

printAmount(char *txt, int amt) {
    printf("%s",txt);
    for(int xa=strlen(txt); xa<40; xa++) { putc('.'); }
    printf("[%d]",amt);
    printf("\n");
    }
2
ответ дан 5 December 2019 в 06:10
поделиться

Другое решение с помощью крошечной функции помощника

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

Это по существу, что отправил Ates, но я на самом деле понял это самостоятельно ;)

2
ответ дан 5 December 2019 в 06:10
поделиться

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

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

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

"%-40s[%s]"
1
ответ дан 5 December 2019 в 06:10
поделиться

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

#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 "));
}
0
ответ дан 5 December 2019 в 06:10
поделиться