Que signifie «%. * S» dans printf?

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

printf("%.*s\n") 

que signifie le %.*s ?

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

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

Je ne pense pas que le code ci-dessus est correct mais (selon cette description de printf() ), le

La largeur n’est pas spécifiée dans la chaîne de format, mais sous la forme d’un argument de valeur entière supplémentaire précédant l’argument à mettre en forme. ‘

Donc, c’est une chaîne avec une largeur passable comme argument.

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 comme un argument de valeur entière supplémentaire précédant l’argument devant être formaté.

s chaîne de caractères

Plus détaillé ici .

valeur entière ou * qui spécifie la largeur minimale du champ. Le résultat est complété par des caractères d’espacement (par défaut), si nécessaire, sur la gauche, si ce dernier est justifié à droite, ou sur la droite, s’il est 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, cela se traduit par la largeur du champ – spécifiée et positive. (Remarque: il s’agit de la largeur minimale: la valeur n’est jamais tronquée.)

. suivi par un nombre entier ou *, ou ne spécifie pas 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, il est ignoré. Si ni un nombre ni un * n’est utilisé, la précision est considérée comme nulle. Voir le tableau ci-dessous pour les effets exacts de la précision.

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

 #include  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|