Wie berechnet man die Länge der Ausgabe, die sprintf erzeugt?

8

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()

%Vor%

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:

%Vor%

S. Ich weiß, dass ich auch die Länge der Ganzzahl durch Protokoll erhalten kann, aber diese Möglichkeiten scheinen schöner.

    
alknows 16.03.2015, 21:20
quelle

5 Antworten

9

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.

    
myaut 16.03.2015, 21:28
quelle
10

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 'NULL' 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.

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:

%Vor%     
Brian Campbell 16.03.2015 21:25
quelle
5

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!

    
M.M 16.03.2015 21:26
quelle
0

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.

%Vor%

Dieser Code wird bei Strings unter 1k zweimal schneller ausgeführt als bei den längeren.

    
quelle
-1

Dies ist nicht unbedingt eine Antwort auf Ihre Frage, aber Sie können es trotzdem hilfreich finden. Es ist nicht portierbar, aber wenn Sie dies auf glibc ausführen, können Sie stattdessen einfach asprintf() verwenden, was die Speicherzuweisung für Sie übernimmt.

    
Dolda2000 16.03.2015 21:32
quelle

Tags und Links