J'ai un extrait de code dans lequel il y a un
printf("%.*s\n")
qu'est-ce que cela %.*ssignifie?
J'ai un extrait de code dans lequel il y a un
printf("%.*s\n")
qu'est-ce que cela %.*ssignifie?
Réponses:
Vous pouvez utiliser un astérisque ( *) pour passer le spécificateur / précision de largeur à 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);
}
str_lenargument doit avoir un type int(ou un type intégral plus étroit, qui serait promu en int). Ce serait un bug à passer long, size_tetc.
%s, est d'imprimer une sous-chaîne de la chaîne d'origine. Dans ce cas d'utilisation, strpointerait vers quelque part à l'intérieur de la chaîne d'origine (éventuellement au début), et str_lenspécifierait la longueur de la sous-chaîne à imprimer.
Plus de détails ici .
valeur entière ou
*qui spécifie la largeur minimale du champ. Le résultat est complété par des espaces (par défaut), si nécessaire, à gauche lorsqu'il est justifié à droite, ou à 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, il en résulte avec l'indicateur - spécifié et une largeur de champ positive. (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, il est ignoré. Si ni un nombre ni * ne sont utilisés, la précision est considérée comme 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|
Je ne pense pas que le code ci-dessus soit correct mais (selon cette description de printf()) les .*moyens
La largeur n'est pas spécifiée dans la chaîne de formatage, mais comme argument de valeur entière supplémentaire précédant l'argument à mettre en forme. '
C'est donc une chaîne avec une largeur passable comme argument.
int(ou un sous-ensemble de celle-ci) - pas simplement n'importe quelle valeur intégrale comme plus intuitive size_tou ses alias possibles, comme std::string::size_type. Ceci est encore plus déroutant, en tenant compte du fait que la page référencée mentionne size_tcomme l'un des spécificateurs de type pris en charge.
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 la forme d'un argument de valeur entière supplémentaire précédant l'argument à mettre en forme.
sChaîne de caractères
printfappel valide .