strcat () für formatierte Strings

8

Ich baue eine Saite Stück für Stück in meinem Programm und benutze derzeit eine Mischung aus strcat (), wenn ich eine einfache Zeichenfolge am Ende hinzufüge, aber wenn ich eine formatierte Zeichenfolge hinzufüge, verwende ich sprintf ( ) zB:

%Vor%

ist es möglich, formatierten String mit strcat () zu verketten oder was ist die bevorzugte Methode dafür?

    
BradStevenson 24.12.2012, 15:19
quelle

5 Antworten

12

Ihre Lösung wird funktionieren. Das Aufrufen von strlen ist etwas peinlich (besonders wenn die Zeichenfolge ziemlich lang wird). sprintf () gibt die Länge zurück, die Sie verwendet haben [strcat wird nicht], also können Sie etwas tun:

%Vor%

Ich bin mir nicht sicher, ob strcat viel effizienter ist als sprintf (), wenn es auf diese Weise verwendet wird.

Edit: sollte kleinere Beispiele schreiben ...

    
Mats Petersson 24.12.2012, 15:25
quelle
8

nein, es ist nicht möglich, aber Sie könnten sprintf() für diese einfachen Strings verwenden und vermeiden, jedesmal strlen() aufzurufen:

%Vor%     
iabdalkader 24.12.2012 15:23
quelle
2

Um die direkte Frage zu beantworten, ist es möglich , strcat zum Anhängen formatierter Strings zu verwenden. Sie müssen nur die formatierte Zeichenfolge zuerst erstellen, und dann können Sie strcat verwenden, um sie anzuhängen:

%Vor%

Ausgabe:

%Vor%

Aber das ist kein besonders guter Ansatz.

sprintf funktioniert genauso gut am Ende einer vorhandenen Zeichenfolge. Siehe Mats 'Antwort und die Antwort des Mux für Beispiele. Die einzelnen Arrays, die einzelne Felder enthalten, sind nicht notwendig, zumindest in diesem Fall nicht.

Und da dieser Code das Ende der Zeichenfolge nicht verfolgt, ist die Leistung wahrscheinlich schlecht. strcat(s1, s2) muss zuerst s1 durchsuchen, um das abschließende 's2' zu finden, und dann den Inhalt von strncat() hineinkopieren. Die anderen Antworten vermeiden dies, indem Sie einen Index oder einen Zeiger weiterleiten, um das Ende der Zeichenfolge zu verfolgen, ohne sie neu berechnen zu müssen.

Der Code unternimmt auch keine Anstrengungen, Pufferüberläufe zu vermeiden. snprintf() kann dies tun, aber es schneidet nur die Zeichenfolge ab; Es sagt Ihnen nicht, dass es abgeschnitten wurde. strcat() ist eine gute Wahl; Sie gibt die Anzahl der Zeichen zurück, die geschrieben hätte, wenn genügend Speicherplatz verfügbar wäre. Wenn dies die von Ihnen angegebene Größe überschreitet, wurde die Zeichenfolge abgeschnitten.

%Vor%

Um mehrere Strings anzuhängen (zB wenn einige bedingt oder wiederholt angehängt sind), können Sie die Methoden in den anderen Antworten verwenden, um das Ende der Zielzeichenfolge zu verfolgen.

Es ist also möglich, formatierte Strings mit %code% anzufügen. Es ist wahrscheinlich keine gute Idee.

    
Keith Thompson 24.12.2012 17:44
quelle
0

Was die bevorzugte Methode ist, hängt davon ab, was Sie verwenden möchten. Anstatt all diese manuellen (und möglicherweise gefährlichen) Zeichenfolgenoperationen auszuführen, würde I die GString -Datenstruktur von GLib oder GLibs g_strdup_print -Funktion verwenden. Für Ihr Problem bietet GString die Funktion g_string_append_printf .

    
matthias 24.12.2012 15:37
quelle
0

Schreiben Sie Ihren eigenen Wrapper für Ihre Bedürfnisse.

Ein Anruf würde so aussehen: -

%Vor%

Sie könnten eine Funktion definieren, um die Sie sich kümmern müssen, wenn Sie sprintf () oder strcat () verwenden müssen. So würde die Funktion aussehen: -

%Vor%

Er sollte zuerst bestimmen, welche der beiden er aufrufen soll (strcat oder sprintf), dann sollte er den Aufruf machen und es Ihnen leicht machen, sich auf die eigentliche Logik dessen, woran Sie gerade arbeiten, zu konzentrieren! Einfach Strg + C Code über und Strg + V in Ihre Code-Basis.

Hinweis: Matts Antwort ist eine gute Alternative für lange Saiten. Aber für kurze Stringlängen (& lt; 250) sollte dies genügen.

    
Sidhartha Mani 24.12.2012 16:36
quelle

Tags und Links