web-dev-qa-db-fra.com

Que signifie "%. * S" dans printf?

J'ai un extrait de code dans lequel il y a un

printf("%.*s\n")

que fait le %.*s signifier?

94
Shaobo Wang

Vous pouvez utiliser un astérisque (*) Pour transmettre le spécificateur de largeur/précision à printf() , plutôt que de le coder en dur dans la chaîne de formatage, c.-à-d.

void f(const char *str, int str_len)
{
  printf("%.*s\n", str_len, str);
}
99
AusCBloke

Plus détaillé ici .

valeur entière ou * qui spécifie la largeur minimale du champ. Le résultat est complété avec des espaces (par défaut), si nécessaire, à gauche lorsque justifié à droite, ou à droite si justifié à gauche. Dans le cas où * est utilisé, la largeur est spécifiée par un argument supplémentaire de type int. Si la valeur de l'argument est négative, il en résulte l'option - flag spécifiée et la largeur du champ positif. (Remarque: il s'agit de la largeur minimale: la valeur n'est jamais tronquée.)

. suivi d'un nombre entier ou *, ou ni l'un ni l'autre qui spécifie la précision de la conversion. Dans le cas où * est utilisé, la précision est spécifiée par un argument supplémentaire de type int. Si la valeur de cet argument est négative, elle est ignorée. Si ni un nombre ni * n'est utilisé, la précision est prise à zéro. Voir le tableau ci-dessous pour les effets exacts de la précision.

Donc, si nous essayons les deux spécifications de conversion

#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;
}

nous obtenons la sortie:

|Hello wo|
|Hello wo|
|     Hello world|
|     Hello world|
13
Ondrej

Je ne pense pas que le code ci-dessus soit correct mais (selon cette description de printf() ) le .* veux dire

La largeur n'est pas spécifiée dans la chaîne de format, mais en tant qu'argument de valeur entière supplémentaire précédant l'argument à formater. '

C'est donc une chaîne avec une largeur passable en argument.

12
rerun

Voir: http://www.cplusplus.com/reference/clibrary/cstdio/printf/

.* La précision n'est pas spécifiée dans la chaîne de format, mais sous forme d'argument de valeur entière supplémentaire précédant l'argument à formater.

s Chaîne de caractères

10
Josh