formatierte Daten unbekannter Länge in einen String schreiben (C-Programmierung)

7

Die folgende C-Funktion:

%Vor%

schreibt formatierte Daten in eine Zeichenfolge. Die Größe des als str übergebenen Arrays sollte ausreichen, um die gesamte formatierte Zeichenfolge zu enthalten. Was aber, wenn die Länge der formatierten Zeichenfolge nicht rechtzeitig bekannt ist? Wie kann diese Funktion (oder eine andere Funktion wie diese) verwendet werden, um formatierte Daten zu schreiben, deren Länge unbekannt ist?

Zum Beispiel:

%Vor%

Der Puffer muss 13 oder größer sein, damit dies funktioniert. Wenn die Länge der Zeichenfolge unbekannt ist und der Puffer beispielsweise auf 5 gesetzt wurde, würde dies nicht funktionieren. Ich brauche etwas, das den Puffer für Zeichenfolgen dynamisch reservieren oder neu zuweisen kann, die größer als der Puffer sind.

    
Charles 06.12.2009, 04:25
quelle

5 Antworten

6

Was Sie wollen, ist eine dieser beiden Funktionen: * snprintf ( Ссылка ). Es nimmt die Länge des Ausgabepuffers als zweites Argument, und wenn der Puffer für das Ergebnis zu klein ist, gibt es die Anzahl der benötigten Zeichen zurück, so dass Sie einen größeren Puffer neu zuweisen können. * asprintf . Es benötigt ein Argument char ** und weist genügend Speicher für die Ausgabe zu, solange dieser zusammenhängende virtuelle Speicher verfügbar ist. Sie müssen free aufrufen, um es aus dem Speicher zu entfernen, wenn Sie damit fertig sind, bevor das Programm beendet wird, und möglicherweise den Speicher für etwas anderes benötigen.

    
JSBձոգչ 06.12.2009, 04:29
quelle
14

Verwenden von snprintf

Die meisten Leute sagen dir, dass du snprintf() verwenden sollst, weil das Ende deines Puffers nicht überschritten wird.

Und das ist OK Rat. Das übliche "Entwurfsmuster" besteht darin, einen temporären Puffer fester Größe zu deklarieren, der größer ist als die Zeichenfolge wahrscheinlich ist, und snprintf() darauf. Wenn die Zeichenfolge für eine Weile gespeichert werden muss, können Sie die Länge malloc(3) another und strcpy(3) den temporären Puffer an den semi-permanenten malloc() -Puffer messen.

Ein Zwei-Weg-Ansatz

Es gibt einen anderen Weg.

C99 gibt an, dass wenn der Puffer NULL ist, keine Bytes geschrieben werden, aber die tatsächliche Länge, die geschrieben worden wäre, wird zurückgegeben. Dies ermöglicht Ihnen einen Dummy-First-Pass, malloc () einen Puffer und dann snprintf() für diesen Puffer. (In der Theorie könnten Sie einfach sprintf() verwenden, da die Länge jetzt bekannt ist, aber ich würde nicht.)

Wie auch immer, ich bin mir nicht sicher, ob ich auf all das zählen würde, wenn mein Programm auf jedem OS laufen müsste, das jemals in der Vergangenheit gemacht wurde, aber es ist ein vernünftiges Muster für die meisten Leute heutzutage.

    
DigitalRoss 06.12.2009 05:08
quelle
2

Ich habe das zusammen als eine Übung für mich basierend auf dem Vorschlag von DigitalRoss geworfen. Fühlen Sie sich frei, dies mit seiner Antwort zu verschmelzen, wenn Sie den rep (ich nicht) haben.

%Vor%     
SiegeX 06.12.2009 07:37
quelle
1

Verwenden Sie zunächst snprintf anstelle von sprintf . snprintf benötigt ein zusätzliches Argument, das die maximale Anzahl der zu schreibenden Bytes angibt (einschließlich des abschließenden 'snprintf' ). '%code%' gibt dann die Anzahl der geschriebenen Bytes zurück, ohne das nachgestellte %code% . So könnten Sie einen Puffer reservieren, den Sie denken, groß genug sein und den Anruf versuchen. Wenn es das Ende des Puffers erreicht hat, befreie den Puffer und mache einen neuen, größeren und versuche es erneut. Spülen und wiederholen.

    
Adam Batkin 06.12.2009 04:30
quelle
1

Sie können entweder snprintf oder asprintf . snprintf beinhaltet die Überprüfung der Größe und Größenanpassung bei Bedarf, während asprintf einfach die richtige Größe für Sie zuweist.

    
user181548 06.12.2009 04:42
quelle

Tags und Links