Я хотів би зробити щось на зразок printf("?", count, char)
повторення символу count
разів.
Який правильний рядок формату для цього?
EDIT: Так, очевидно, що я міг би зателефонувати printf()
у циклі, але саме цього я хотів уникнути.
Я хотів би зробити щось на зразок printf("?", count, char)
повторення символу count
разів.
Який правильний рядок формату для цього?
EDIT: Так, очевидно, що я міг би зателефонувати printf()
у циклі, але саме цього я хотів уникнути.
printf
формату, який робить те, що ви хочете), але ваші коментарі залишають мене невпевненим у тому, що ви запитуєте. Ви говорите про рядок формату та аргументи, які передаються у вашу функцію. Про яку функцію ви запитуєте? Здається, є речі, про які ви нам не кажете
Відповіді:
Коротка відповідь - так, довга відповідь: не так, як ти хочеш.
Ви можете використовувати форму% * 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;
}
4096
. Я припускаю, ви могли б malloc
буфер.
Ви можете використовувати наступну техніку:
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
, або написати функцію, яка копіює рядок, що рахує рази, у новий рядок.
printf
не робить цього - і printf
надмірно друкує один символ.
char c = '*';
int count = 42;
for (i = 0; i < count; i ++) {
putchar(c);
}
Не переживайте, що це неефективно; putchar()
буферизує свій вихід, тому він не буде виконувати фізичну операцію виведення для кожного символу, якщо це не потрібно.
printf
допомогою рядка формату має бути "%c"
. Але вам не потрібно використовувати printf
, і в такому випадку вам зовсім не потрібен рядок форматування. (Просто не існує printf
рядка формату, який би надрукував символ кілька разів, але є інші та кращі способи виконати завдання.)
Якщо у вас є компілятор, який підтримує функцію alloca (), то це можливе рішення (хоча й досить потворне):
printf("%s", (char*)memset(memset(alloca(10), '\0', 10), 'x', 9));
В основному він виділяє 10 байтів у стеку, які заповнюються символом '\ 0', а потім перші 9 байтів заповнюються знаком 'x'.
Якщо у вас є компілятор C99, це може бути більш акуратним рішенням:
for (int i = 0; i < 10; i++, printf("%c", 'x'));
putchar('x')
замість printf("%c", 'x')
.
#include <stdio.h>
#include <string.h>
void repeat_char(unsigned int cnt, char ch) {
char buffer[cnt + 1];
/*assuming you want to repeat the c character 30 times*/
memset(buffer,ch,cnd); buffer[cnt]='\0';
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;
}
Це виведе
#####
i < count
. В іншому випадку негативний вхід для підрахунку може призвести до великої кількості небажаних відбитків.
printf("%.*s\n",n,(char *) memset(buffer,c,n));
n
<= sizeof(buffer)
[можливо також n <2 ^ 16]
Однак оптимізатор може змінити його на, puts(buffer)
і тоді відсутність EoS .....
І припущення полягає в тому, що memset - це інструкція асемблера (але все одно цикл, будь то на мікросхемі).
Власне кажучи, немає жодного рішення, якщо ви отримаєте передумову "Немає циклу".
я думаю робити щось подібне.
void printchar(char c, int n){
int i;
for(i=0;i<n;i++)
print("%c",c);
}
printchar("*",10);