printf-Zeichenfolge, Element mit variabler Länge

Lesezeit: 2 Minuten
#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?

  • Sie scheinen eine Formatzeichenfolge zu erstellen. Aber Sie sollten die Zeichenfolge zuweisen, die von zurückgegeben wird sprintf zu fmt_string und fmt_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

Benutzeravatar von Trent
Trient

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.

  • Hatte sie verwechselt … scanf ist derjenige, der diese Option nicht hat.

    – Wilhelm Entriken

    16. Mai 2011 um 3:56 Uhr

  • Es funktioniert auch mit 2 Längen wie "%*.*s", minlength, maxlength, letters.

    – ott–

    11. September 2013 um 12:39 Uhr

  • Notiz: "*m$" ist kein Standard-C.

    – chux – Wiedereinsetzung von Monica

    13. März 2016 um 23:58 Uhr

  • Gibt es eine Möglichkeit, das Format “%.*s” zu akzeptieren size_t Anstatt von int?

    – Jimmay

    13. Juni 2016 um 18:47 Uhr

Benutzeravatar von Niemandem im Besonderen
Niemand Bestimmtes

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.

  • Obwohl asprintf tatsächlich eine interessante Funktion ist, ist es wichtig zu beachten, dass es sich um eine GNU-Erweiterung handelt. Außerdem bin ich mir nicht sicher, wie dies die Frage beantwortet.

    – Trient

    9. Mai 2011 um 4:20 Uhr

  • @Trent, es stimmt, dass es als GNU-Erweiterung begann, aber in der Zwischenzeit OpenBSD, FreeBSD und NetBSD habe es umgesetzt. Eben Mac OS X hat es jetzt.

    – Cristian Ciupitu

    14. Oktober 2014 um 1:09 Uhr

1410640cookie-checkprintf-Zeichenfolge, Element mit variabler Länge

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy