Verifizierter printf-Format-String

Gibt es eine C/C++-Bibliothek, die ähnlich wie printfmit einer Formatzeichenfolge formatieren kann, die jedoch überprüft, ob diese Formatzeichenfolge bestimmte Einschränkungen erfüllt und mit den Argumenten übereinstimmt?

Der Grund dafür ist, dass das Programm einen Formatstring aus Benutzereingaben als Vorlage für eine Reihe von Dateinamen mit einer ganzzahligen Indexvariablen verwenden soll. Der Benutzer könnte also image%d.pngoder angeben image%.6d.png, hack_%d_%swürde aber nicht akzeptiert.

Antworten (1)

Die unmittelbarste Antwort auf Ihre Frage ist, glaube ich, tinyformat , das nur darauf abzielt, einen typsicheren printf()Ersatz bereitzustellen, und in Gebrauch ist. Ich würde Ihnen jedoch nicht empfehlen, diesen zu wählen.

Sie wären wahrscheinlich besser mit fmt bedient , das einen größeren Anwendungsbereich hat, aber mehr leistet, mehr Entwicklung erfahren hat und häufiger verwendet wird (es gibt auch das ältere FastFormat ). Wie Sie an den Links sehen werden, werden sie Sie nicht enttäuschen printf().

Wenn Sie möglichst einfache Do-it-yourself-Dinge haben möchten, gibt es eine auf Variadic-Vorlagen basierende sichere printf()Implementierungsidee von C++-Koryphäe Andrei Alexandrescu aus dem Jahr 20120 – siehe diese StackOverflow.com - Antwort für Details.


Eine letzte Anmerkung außerhalb des Rahmens des spezifischen Szenarios von OP: Mit C ++ 17 ist es möglich geworden, sogar über all diese Optionen hinauszugehen und constexprFormat-String-Konstanten zu verwenden, um die Überprüfung vollständig zur Kompilierzeit statt zur Laufzeit durchzuführen. was großartig wäre (vorausgesetzt natürlich, Sie kennen Ihr Format vorher). Nichts dergleichen wurde im Moment veröffentlicht (soweit ich weiß).

Wie helfen constexpr-Formatzeichenfolgen OP, wer eine Formatzeichenfolge über die Tastatur eingeben möchte?
@IraBaxter: Es hilft nicht im speziellen Fall von OP, aber es hilft im allgemeinen Fall, der durch den Titel der Frage dargestellt wird. Ich werde es bearbeiten, um das zu verdeutlichen.