Как повторить символ с помощью 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);