printf chaîne de caractères de longueur variable, élément
#define SIZE 9
int number=5;
char letters[SIZE]; /* this wont be null-terminated */
...
char fmt_string[20];
sprintf(fmt_string, "%%d %%%ds", SIZE);
/* fmt_string = "%d %9d"... or it should be */
printf(fmt_string, number, letters);
Est-il une meilleure façon de le faire?
- Vous semblez être la construction d'une chaîne de format. Mais vous devriez être à l'affectation de la chaîne de caractères retournée par
sprintf
àfmt_string
etfmt_string
ne devrait pas être dans la liste des paramètres. - Est-il une raison particulière pour laquelle vous dire que
letters
de ne pas être nul? - c'était pour un problème de recherche avec un grand jeu de données où je ne pouvais pas se permettre de l'espace pour contenir des caractères null.
- REMARQUE: c'est la duplicité de stackoverflow.com/questions/2239519/...
Vous devez vous connecter pour publier un commentaire.
Il n'est pas nécessaire de construire un format spécial de la chaîne.
printf
vous permet de spécifier la précision à l'aide d'un paramètre (qui précède la valeur) si vous utilisez un.*
que la précision dans le format de la balise.Par exemple:
Remarque: il y a une distinction entre la largeur (ce qui est un minimum de la largeur de champ) et la précision (qui donne le nombre maximal de caractères à imprimer).
%*s
spécifie la largeur,%.s
spécifie la précision. (et vous pouvez également utiliser%*.*
mais alors vous avez besoin de deux paramètres, l'un pour la largeur de l'un pour la précision)Voir aussi le printf page de man (
man 3 printf
sous Linux) et en particulier les sections sur le terrain de la largeur et de la précision:"%*.*s", minlength, maxlength, letters
."*m$"
n'est pas standard C.size_t
au lieu deint
?Un peu de fonction inconnue est
asprintf
. Le premier paramètre est un**char
. Cette fonctionmalloc
l'espace pour la chaîne de sorte que vous n'avez pas à faire la tenue de la comptabilité. N'oubliez pas defree
la chaîne lorsque vous avez terminé.est un exemple d'utilisation.