2012-03-30 11 views
8

Co to jest %*d? Wiem, że %d jest używany dla integers, więc myślę, że %*d również musi odnosić się tylko do liczby całkowitej? Jaki jest tego cel? Co to robi?Jaka jest różnica między% d a% * dw języku c?

int a=10,b=20; 
printf("\n%d%d",a,b); 
printf("\n%*d%*d",a,b); 

Wynik jest

10 20 
1775 1775 
+4

Wygląda jak specyfikator szerokości: http://www.cplusplus.com/reference/clibrary/cstdio/printf/ – Mysticial

+2

@Mysticial Powinieneś napisać to jako odpowiedź .. – Ben

+0

@Ben, to tylko link - który robi "t zakwalifikować jako odpowiedź. Jestem zbyt leniwy, żeby się na to rozwinąć ... – Mysticial

Odpowiedz

10

Przy zastosowaniu funkcji scanf(), to znaczy, że liczba całkowita jest przetwarzany, ale efekt nie jest przechowywany w dowolnym miejscu.

W przypadku użycia funkcji printf() oznacza to, że argument width jest określony przez następny argument formatu.

5

Gwiazdka * służy jako wskazówka, że ​​szerokość jest przekazywana jako parametr printf

+1

Dlaczego więc produkuje on moc wyjściową 1775 1775? – Parag

+1

printf jest zmienną funkcją argumentu, więc gdy analizowany jest ciąg formatujący, szuka liczby całkowitej reprezentującej szerokość pierwszej wartości, samej wartości, szerokości drugiej wartości i drugiej wartości. Ponieważ podajesz tylko 2 wartości, użyte wartości są niezdefiniowane. Spróbuj użyć 4 istotnych wartości i zobacz wynik. – guga

17

%*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ć.

+1

+1 za "Ta doskonała odpowiedź" ... :) – guga

+0

Dokładne wyjaśnienie. :) – barnes

Powiązane problemy