%*d
в printf
позволяет использовать переменную для управления шириной поля вдоль линий:
int wid = 4;
printf ("%*d\n", wid, 42);
, который даст вам:
..42
(каждый из этих .
символов - пробел). *
использует один аргумент wid
, а d
- 42
.
Форма, которую вы имеете, например:
printf ("%*d %*d\n", a, b);
является неопределенным поведением согласно стандарту, поскольку вы должны предоставлять четыре аргумента после строки формата, а не два (и хорошие компиляторы, такие как gcc
, сообщат вам об этом, если вы увеличите предупреждение уровень). От C11 7.20.6 Formatted input/output functions
:
Если для формата недостаточно аргументов, поведение не определено.
Это должно быть что-то вроде:
printf ("%*d %*d\n", 4, a, 4, b);
И причина, по которой вы получаете странный вывод, связана с этим неопределенным поведением. Этот превосходный ответ показывает вам, что может пойти не так (и почему), если вы не следуете правилам, особенно в этой ситуации.
Теперь я не ожидал бы, что это будет проблемой смещения, так как вы используете int
для всех типов данных, но, как и для любого неопределенного поведения, может произойти что угодно .