Вам не нужно использовать цикл, чтобы распечатать ваши иксы. Вы можете объявить одну строку x, которая соответствует максимальному количеству, которое вам понадобится, а затем использовать спецификацию размера в вызове printf
, чтобы контролировать, сколько печатается. Вот простой пример, чтобы проиллюстрировать, что я имею в виду:
#include <stdio.h>
#include <string.h>
int main(void)
{
char maxBar[] = "xxxxxxxxxx";
size_t i;
for (i = 0; i < strlen(maxBar); i++)
{
printf("%lu: %-*.*s\n", (unsigned long) i, strlen(maxBar), i, maxBar);
}
return 0;
}
Вывод должен выглядеть следующим образом:
0: __________
1: x_________
2: xx________
3: xxx_______
4: xxxx______
5: xxxxx_____
и т. Д., Где _
представляет пробел.
A *
в спецификаторе преобразования printf
указывает, что спецификация ширины поля или точности передается в качестве аргумента printf
. Запись
printf("%-*.*s\n", 10, 2, "test");
- это то же самое, что и запись
printf("%-10.2s\n", "test");
, что, читая слева направо, означает
-
: выравнивание по левому краю для вывода
10
: минимальная ширина поля составляет 10 символов
.2
: Точность (максимальное количество напечатанных символов) составляет 2
Таким образом, вывод выглядит как
te________
, где _
представляет символ пробела.
Итак, если вы знаете, насколько большим должен быть ваш бар заранее, вы можете написать что-то вроде
for (i = 0; i < k; i++)
{
printf("%d-%d (%d) %*.*s\n", lo[k], hi[k], ct[k], strlen(maxBar), ct[k], maxBar);
}