#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);
Gibt es einen besseren Weg, dies zu tun?
Es ist nicht erforderlich, eine spezielle Formatzeichenfolge zu erstellen. printf
ermöglicht es Ihnen, die Genauigkeit mithilfe eines Parameters (der dem Wert vorangeht) anzugeben, wenn Sie a verwenden .*
als die Genauigkeit im Format-Tag.
Zum Beispiel:
printf ("%d %.*s", number, SIZE, letters);
Hinweis: Es gibt einen Unterschied zwischen Breite (das ist eine minimale Feldbreite) und Genauigkeit (die die maximale Anzahl der zu druckenden Zeichen angibt).
%*s
gibt die Breite an, %.s
gibt die Genauigkeit an. (Und Sie können auch verwenden %*.*
aber dann brauchen Sie zwei Parameter, einen für die Breite und einen für die Genauigkeit)
Siehe auch die Manpage printf (man 3 printf
unter Linux) und insbesondere die Abschnitte zu Feldbreite und Genauigkeit:
Anstelle einer dezimalen Ziffernfolge kann man “*” oder “*m$” (für eine dezimale Ganzzahl m) schreiben, um anzugeben, dass die Genauigkeit im nächsten Argument angegeben wird, bzw. im m-ten Argument, was sein muss vom Typ int.
Eine etwas unbekannte Funktion ist asprintf
. Der erste Parameter ist a **char
. Diese Funktion wird malloc
Platz für die Zeichenfolge, damit Sie die Buchhaltung nicht machen müssen. Erinnere dich an free
die Zeichenfolge, wenn Sie fertig sind.
char *fmt_string;
asprintf(&fmt_string, "%%d %%%ds", SIZE);
printf(fmt_string, number, letters);
free(fmt_string);
ist ein Anwendungsbeispiel.
Sie scheinen eine Formatzeichenfolge zu erstellen. Aber Sie sollten die Zeichenfolge zuweisen, die von zurückgegeben wird
sprintf
zufmt_string
undfmt_string
sollte nicht in der Parameterliste stehen.– Pavillon
9. Mai 2011 um 3:41 Uhr
Gibt es einen bestimmten Grund, warum Sie das sagen?
letters
wird nicht nullterminiert?– Andreas Keeton
9. Mai 2011 um 3:53 Uhr
@AndrewKeeton Dies war für ein Suchproblem mit einem großen Datensatz, bei dem ich mir nicht den Platz für Nullzeichen leisten konnte.
– Wilhelm Entriken
11. Oktober 2014 um 19:46 Uhr
HINWEIS: Dies ist eine Duplizität von stackoverflow.com/questions/2239519/…
– pevik
2. September 2016 um 8:31 Uhr