Co robi"%.* S " oznacza w printf?

Mam fragment kodu, w którym jest

printf("%.*s\n")

Co oznacza %.*s?

Author: hippietrail, 2011-10-26

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);
}
 128
Author: AusCBloke,
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|
 24
Author: Ondrej,
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.

 12
Author: rerun,
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

 10
Author: Josh,
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