2011-07-31 3 views
10

Wszyscy wiemy w językach opartych na języku C, printf ("% 11d", some_int); oznacza wyrównanie w obrębie 11-znakowego pola, ale co jeśli chciałbym zastąpić tę stałą 11 tutaj zmienną dynamiczną, co mam zrobić?Jak przekazać parametr n do printf ("% nd", some_int);

+0

strony podręczników mogą być dobrymi przyjaciółmi :) – Sujoy

Odpowiedz

17

Można użyć znaku * określić szerokość pola w swojej argumentacji:

printf("%*d", some_width, some_int); 
+1

hahaha, nigdy nie wiedziałem o tym 0o – unkulunkulu

+0

uwaga: argument width musi mieć typ 'int', więc zazwyczaj będziesz chciał użyć obsady, aby to zapewnić –

0

Jednym ze sposobów osiągnięcia tego celu jest użyć snprintf ekwiwalent w buforze tablicy znaków, aby stworzyć swój ciąg w formacie printf. (Pamiętaj, aby sprawdzić na przepełnienie bufora, oczywiście.)

+0

Ups, Frédéric ma odpowiedź lepszy niż mój. –

6

Będziesz przeczytać stronę printf(3) mężczyzna i natknąć się co następuje:

Zamiast dziesiętnych cyfr ciąg można wpisać „*” lub "* m $" (dla pewnej liczby całkowitej dziesiętnej m) w celu określenia, że ​​szerokość pola jest podana w następnym argumencie, lub w , odpowiednio, m-tego argumentu, który musi być typu int.

2

użyj polecenia linux: "man 3 printf", aby uzyskać więcej informacji. Jednym ze sposobów, aby to zrobić jest

printf("%*d", width, num); 

gdzie szerokość jest precyzja i num jest argumentem do wydrukowania. Inny sposób równoważny powyżej jednego jest

printf("%2$*1$d", width, num); 

Bardziej ogólnie to jest napisane jak "* M $ d", gdzie m jest int i Argument numer.

+0

Druga opcja nie jest w ISO C (myślę, że jest to rozszerzenie POSIX) –