it-swarm.com.de

printf Zeichenfolge, Element variabler Länge

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

38

Es ist nicht erforderlich, eine spezielle Formatzeichenfolge zu erstellen. Mit printf können Sie die Genauigkeit mithilfe eines Parameters (der dem Wert vorausgeht) angeben, wenn Sie ein .* als Genauigkeit im Format-Tag.

Beispielsweise:

printf ("%d %.*s", number, SIZE, letters);

Hinweis: Es gibt einen Unterschied zwischen der Breite (die eine minimale Feldbreite ist) und der Genauigkeit (die die maximale Anzahl der zu druckenden Zeichen angibt). %*s gibt die Breite an, %.s gibt die Genauigkeit an. (und du kannst auch %*.* aber dann brauchst du zwei Parameter, einen für die Breite, einen für die Präzision)

Siehe auch die printf-Manpage ( man 3 printf unter Linux) und insbesondere die Abschnitte zu Feldbreite und Genauigkeit:

Anstelle einer dezimalen Ziffernfolge kann "*" oder "* m $" (für eine dezimale Ganzzahl m) geschrieben werden, um anzugeben, dass die Genauigkeit im nächsten bzw. im m-ten Argument angegeben wird vom Typ int.

105
Trent

Eine etwas unbekannte Funktion ist asprintf . Der erste Parameter ist ein **char. Diese Funktion wird malloc Platz für die Zeichenfolge, so dass Sie die Buchhaltung nicht tun müssen. Denken Sie daran, die Zeichenfolge zu free, wenn Sie fertig sind.

char *fmt_string;

asprintf(&fmt_string, "%%d %%%ds", SIZE);
printf(fmt_string, number, letters);
free(fmt_string);

ist ein Anwendungsbeispiel.