Ziel : Daten in JSON serialisieren.
Problem : Ich kann nicht im Voraus wissen, wie viele Zeichen lang die Ganzzahl ist.
Ich dachte, ein guter Weg, dies zu tun, ist mit sprintf()
Natürlich kann ich eine Stapelvariable wie char a[256]
anstelle von no_buff
verwenden.
Frage: Aber gibt es in C ein Dienstprogramm für Einweg-Schreibvorgänge wie das Unix /dev/null
?
Smth so:
S. Ich weiß, dass ich auch die Länge der Ganzzahl durch Protokoll erhalten kann, aber diese Möglichkeiten scheinen schöner.
Da C eine einfache Sprache ist, gibt es keine "Wegwerfpuffer" - alle Speicherverwaltungen befinden sich auf den Schultern der Programmierer (es gibt GNU C-Compiler-Erweiterungen für diese, aber sie sind nicht Standard).
kann vorher nicht wissen, wie viele Zeichen lang die ganze Zahl ist.
Es gibt viel einfachere Lösung für Ihr Problem. snprintf
weiß!
Auf C99-kompatiblen Plattformen rufen Sie snprintf mit NULL als erstes Argument auf:
%Vor% Verwenden Sie in älteren Visual Studio-Versionen (die nicht mit C99 kompatible CRT-Dateien enthalten) _scprintf
anstelle von snprintf(NULL, ...)
call.
Sie können int len = snprintf(NULL, 0, "{data:%d}", 12312)
aufrufen, um zu testen, wie viel Speicherplatz Sie benötigen.
snprintf
druckt höchstens size
Zeichen, wobei size
das zweite Argument ist, und gibt zurück, wie viele Zeichen notwendig gewesen wären, um das ganze Ding zu drucken, ohne das abschließende '
zu zählen. Da Sie 0 übergeben, schreibt es eigentlich nichts aus (und vermeidet somit jede Nullzeiger-Ausnahme, die auftritt, wenn% des_de% dereferenziert wird), liefert aber immer noch die Länge, die für die gesamte Ausgabe benötigt wird , mit dem Sie Ihren Puffer reservieren können. NULL
'
An diesem Punkt können Sie Ihrem Puffer zuweisen und drucken, wobei Sie daran denken, für den nachlaufenden '%code%'
noch einen hinzu zu fügen:
Um nur die Länge zu erhalten, können Sie schreiben:
%Vor% Beachten Sie, dass der Rückgabetyp int
ist. Es kann -1
im Falle einer Art von Fehler zurückgeben. Stellen Sie sicher, dass Ihre Eingabedaten keine langen Zeichenfolgen enthalten, die dazu führen könnten, dass die Gesamtlänge INT_MAX
! Überschreitet!
Wenn Sie die Leistung überprüfen, dauert das Ausführen von snprintf ohne einen Ausgabepuffer ungefähr die gleiche Zeit wie ein vollständiger Aufruf.
Ich empfehle Ihnen daher, für alle Fälle einen kleineren Puffer zu verwenden und ihn nur ein zweites Mal aufzurufen, wenn die zurückgegebene Größe die Puffergröße überschritten hat.
Dies verwendet C ++ std::string
, aber ich denke, Sie können es für Ihre Bedürfnisse anpassen.
Dieser Code wird bei Strings unter 1k zweimal schneller ausgeführt als bei den längeren.