Co robi"%.* S " oznacza w printf?
Mam fragment kodu, w którym jest
printf("%.*s\n")
Co oznacza %.*s
?
4 answers
Możesz użyć gwiazdki (*
), aby przekazać specyfikator szerokości / precyzję do printf()
, zamiast twardego kodowania go do formatu string, tzn.
void f(const char *str, int str_len)
{
printf("%.*s\n", str_len, str);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-07 21:22:00
Bardziej szczegółowe tutaj .
Wartość całkowita lub
*
określająca minimalną szerokość pola. Wynik jest wypełniony znakami spacji (domyślnie), jeśli jest to wymagane, po lewej stronie, jeśli jest to uzasadnione w prawo, lub po prawej, jeśli jest to uzasadnione w lewo. W przypadku użycia * szerokość jest określona dodatkowym argumentem typu int. Jeśli wartość argumentu jest ujemna, to wynik zostanie podany z flagą-i dodatnią szerokością pola. (Uwaga: jest to minimalna szerokość: wartość jest nigdy nie okrojona.)
.
po którym następuje liczba całkowita lub *, lub żadna z nich, która określa dokładność nawrócenia. W przypadku użycia * precyzja jest określony dodatkowym argumentem typu int. Jeśli wartość tego argument jest negatywny, jest ignorowany. Jeśli ani Liczba, ani * nie są użyte, precyzja jest brana jako zero. Dokładne informacje znajdują się w poniższej tabeli efekty precyzji.
Więc jeśli spróbujemy zarówno specyfikacji konwersji
#include <stdio.h>
int main() {
int precision = 8;
int biggerPrecision = 16;
const char *greetings = "Hello world";
printf("|%.8s|\n", greetings);
printf("|%.*s|\n", precision , greetings);
printf("|%16s|\n", greetings);
printf("|%*s|\n", biggerPrecision , greetings);
return 0;
}
Otrzymujemy wyjście:
|Hello wo|
|Hello wo|
| Hello world|
| Hello world|
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-30 19:36:22
Wydaje mi się, że powyższy kod nie jest poprawny, ale (zgodnie z tym opisem printf()
) .*
oznacza
Szerokość nie jest określona w łańcuchu formatowania, ale jako dodatkowy argument o wartości całkowitej poprzedzający argument, który ma być sformatowany.'
Więc jest to ciąg znaków z przechodnią szerokością jako argumentem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-30 04:52:00
Zobacz: http://www.cplusplus.com/reference/clibrary/cstdio/printf/
.*
precyzja nie jest określona w łańcuchu formatowania, lecz jako dodatkowy argument o wartości całkowitej poprzedzający argument, który ma być sformatowany.
s
ciąg znaków
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55