Как повторить символ с помощью printf?

Я хотел бы сделать что-то вроде printf("?", count, char) повторять символ count раза.

каков правильный формат-строка для этого?

EDIT: Да, очевидно, что я мог бы позвонить printf() в цикле, но это именно то, чего я хотел избежать.

12 ответов


короткий ответ-да, длинный ответ: не так, как вы хотите.

вы можете использовать %* форма printf, который принимает переменную ширину. И, если вы используете '0' в качестве значения для печати в сочетании с выровненным по правому краю текстом, который равен нулю слева..

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

выдает:

00000000000000000000

С моим языком, твердо упертым в мою щеку,я предлагаю этот маленький фрагмент кода ужасов.

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

#include <stdio.h>

int width = 20;
char buf[4096];

void subst(char *s, char from, char to) {
    while (*s == from)
    *s++ = to;
}

int main() {
    sprintf(buf, "%0*d", width, 0);
    subst(buf, '0', '-');
    printf("%s\n", buf);
    return 0;
}

Вы можете использовать следующую технику:

printf("%.*s", 5, "=================");

выводит "=====" Он работает для меня в Visual Studio, нет причин, по которым он не должен работать на всех компиляторах C.


В c++ вы можете использовать std:: string для получения повторяющегося символа

printf("%s",std::string(count,char).c_str());

например:

printf("%s",std::string(5,'a').c_str());

выход:

aaaaa

нет такой вещи. Вам придется либо написать цикл, используя printf или puts или напишите функцию, которая копирует время подсчета строк в новую строку.


Если вы ограничиваете себя повторением либо 0, либо пробела, вы можете сделать:

помещений:

printf("%*s", count, "");

на нули:

printf("%0*d", count, 0);

Если у вас есть компилятор, поддерживающий функцию alloca (), то это возможное решение (довольно уродливое, хотя):

printf("%s", (char*)memset(memset(alloca(10), '', 10), 'x', 9));

он в основном выделяет 10 байтов в стеке, которые заполняются "\0", а затем первые 9 байтов заполняются "x".

Если у вас есть компилятор C99, то это может быть более аккуратное решение:

for (int i = 0;  i < 10;  i++, printf("%c", 'x'));

printf Не-а printf является излишним для печати одного символа.

char c = '*';
int count = 42;
for (i = 0; i < count; i ++) {
    putchar(c);
}

не беспокойтесь о том, что это неэффективно; putchar() буферизует его вывод, поэтому он не будет выполнять физическую операцию вывода для каждого символа, если это не нужно.


char buffer[31];
/*assuming you want to repeat the c character 30 times*/
memset(buffer,(int)'c',30); buffer[30]='';
printf("%s",buffer)

вы можете сделать функцию, которая выполняет эту работу и использовать ее

#include <stdio.h>

void repeat (char input , int count )
{
    for (int i=0; i != count; i++ )
    {
        printf("%c", input);
    }
}

int main()
{
    repeat ('#', 5);
    return 0;
}

выводится

#####

printf("%.*s\n",n,(char *) memset(buffer,c,n));

n sizeof(buffer) [ возможно также n

однако оптимизатор может изменить его на puts(buffer) и тогда отсутствие EoS будет .....

и предполагается, что memset является инструкцией ассемблера (но все же цикл будет включен чип.)

строго видно, что нет решения, учитывая предварительное условие "нет цикла".


char buffer[41];

memset(buffer, '-', 40);    // initialize all with the '-' character<br /><br />
buffer[40] = 0;             // put a NULL at the end<br />

printf("%s\n", buffer);     // show 40 dashes<br />

Я думаю, делать что-то вроде этого.

void printchar(char c, int n){
     int i;
     for(i=0;i<n;i++)
         print("%c",c);
}

printchar("*",10);