Пока строка с отметками #
достаточно длинна (по крайней мере, n
из них), вы можете использовать:
for (i = 0; i < n; i++)
printf("%*.*s\n", n, i+1, "##########");
Маркеры *
в строке формата означают «прочитать int
из списка параметров» - см., Например, спецификацию POSIX printf()
или спецификацию C11 fprintf()
. Например, нотация "%10.6s\n"
будет означать «напечатать поле шириной 10 символов, выровненное по правому краю, пустое поле слева, не более 6 символов из строкового аргумента». Итак, если n
равно 10
, цикл работает следующим образом:
printf("%10.1s\n", "##########"); // 9 blanks, 1 hash
printf("%10.2s\n", "##########"); // 8 blanks, 2 hashes
…
printf("%10.9s\n", "##########"); // 1 blank, 9 hashes
printf("%10.10s\n", "##########"); // 0 blanks, 10 hashes
Вы можете попробовать следующий код:
#include <stdio.h>
int main(void)
{
int n = 10;
for (int i = 0; i < n; i++)
printf("%*.*s\n", n, i + 1, "##########");
return 0;
}
Или:
#include <stdio.h>
#include <string.h>
int main(void)
{
int n = 10;
char data[n + 1];
memset(data, '#', n);
data[n] = '\0';
for (int i = 0; i < n; i++)
printf("%*.*s\n", n, i + 1, data);
return 0;
}
Или:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int n = 10;
char *data = malloc(n + 1);
memset(data, '#', n);
data[n] = '\0';
for (int i = 0; i < n; i++)
printf("%*.*s\n", n, i + 1, data);
free(data);
return 0;
}
Последние два будут обрабатывать значения n
больше 10
без каких-либо проблем. Как показано, первое не будет (но, конечно, его можно легко адаптировать для обработки умеренных значений n
). Обратите внимание, что средний использует VLA (массив переменной длины); это обязательная функция C99 и дополнительная функция C11 и C18. Последний должен проверить, что malloc()
успешно. Для вероятных значений n
это вряд ли даст сбой в этом контексте, но в более крупной программе проверка всегда рекомендуется.