%*d
w printf
pozwala na korzystanie z zmienną kontrolować szerokość pola, wzdłuż linii:
int wid = 4;
printf ("%*d\n", wid, 42);
które dadzą ci:
..42
(z każdego z tych .
znaków będących spacją). *
zużywa jeden argument wid
, a d
pochłania 42
.
Formularz masz, jak:
printf ("%*d %*d\n", a, b);
jest niezdefiniowane zachowanie zgodnie z normą, ponieważ powinno być zapewnienie cztery argumenty po łańcuchu formatu, nie dwa (i dobre kompilatory jak gcc
powie o tym, jeśli podniesiesz poziom ostrzeżenia). Od C11 7.20.6 Formatted input/output functions
:
Jeśli nie ma wystarczających argumentów dla formatu, zachowanie jest niezdefiniowane.
Powinno być coś takiego:
printf ("%*d %*d\n", 4, a, 4, b);
A powód dostajesz wyjście dziwne to spowodowane tym zachowanie niezdefiniowane. This excellent answer pokazuje rzeczy, które mogą się nie udać (i dlaczego), gdy nie stosujesz się do zasad, szczególnie dotyczących tej sytuacji.
Teraz nie spodziewałbym się, że jest to kwestia wyrównania ponieważ używasz int
dla wszystkich typów danych, ale jak w przypadku wszystkich niezdefiniowanych zachowań, niczego może się zdarzyć.
Wygląda jak specyfikator szerokości: http://www.cplusplus.com/reference/clibrary/cstdio/printf/ – Mysticial
@Mysticial Powinieneś napisać to jako odpowiedź .. – Ben
@Ben, to tylko link - który robi "t zakwalifikować jako odpowiedź. Jestem zbyt leniwy, żeby się na to rozwinąć ... – Mysticial