Wie fügt man Strings mit sprintf an?

Lesezeit: 4 Minuten

Benutzeravatar von user46646
Benutzer46646

Ich stehe vor einem ernsthaften Problem mit sprintf.

Angenommen, mein Code-Snippet lautet:

sprintf(Buffer,"Hello World");
sprintf(Buffer,"Good Morning");
sprintf(Buffer,"Good Afternoon");
.
.
.

Einige hundert Sprints….

Wenn ich das tue, wird es überschrieben.

Wie kann ich das Überschreiben mit vermeiden sprintf? Wenn ich ein gebe printf Am Ende möchte ich alle Linien sehen.

  • Ich werde nicht sprintf verwenden, sondern snprintf, ich werde nicht printf( str ) verwenden, sondern printf( “%s” , str )

    – Fa.

    20. April 2010 um 12:59 Uhr

Du brauchst:

sprintf(Buffer,"Hello World");
sprintf(Buffer + strlen(Buffer),"Good Morning");
sprintf(Buffer + strlen(Buffer),"Good Afternoon");

und natürlich muss Ihr Puffer groß genug sein.

  • +1 Obwohl mir die Lösung von Aeth etwas besser gefällt, scheint sie etwas effizienter zu sein, als die Zeichenfolgenlänge jedes Mal neu zu berechnen.

    – Extraneon

    20. April 2010 um 10:47 Uhr

  • Ein Trick, den ich in dieser Richtung gesehen habe, ist to #define eos(s) ((s)+strlen(s)), oder deklarieren Sie eine Funktion, wenn Sie dies bevorzugen. Dann können Sie verwenden sprintf(eos(Buffer), "Stuff")

    – clstrfsck

    20. April 2010 um 10:47 Uhr

  • Einfacher noch, Sie können einfach verwenden sprintf(strchr(s, '\0'), "...").

    – Arto Bendiken

    29. März 2014 um 12:48 Uhr

  • Wozu dient das Anhängen von + strlen(Buffer) an den eigentlichen Buffer?

    – bretcj7

    17. September 2016 um 3:43 Uhr

  • Das ist Zeigerarithmetik. Es ist wie das Hinzufügen der aktuellen Länge des Strings zur Startadresse des ‘Puffers’. Dieser Vorgang ist für MBS und Unicode-Strings nicht sicher. Zum Beispiel würde das Abrufen der Länge der Unicode-Zeichenfolge “Hallo” 5 zurückgeben, aber tatsächlich Puffer + 5 * sizeof(wchar_t) ist in diesem Fall erforderlich

    – AB

    17. Februar 2017 um 7:11 Uhr

Benutzeravatar von Matthew T. Staebler
Matthew T. Staebler

int length = 0;
length += sprintf(Buffer+length, "Hello World");
length += sprintf(Buffer+length, "Good Morning");
length += sprintf(Buffer+length, "Good Afternoon");

Hier ist eine Version mit einiger Fehlerresistenz. Es ist nützlich, wenn es Ihnen egal ist, wenn Fehler passieren, solange Sie Ihren fröhlichen Weg fortsetzen können, wenn sie auftreten.

int bytes_added( int result_of_sprintf )
{
    return (result_of_sprintf > 0) ? result_of_sprintf : 0;
}

int length = 0;
length += bytes_added(sprintf(Buffer+length, "Hello World"));
length += bytes_added(sprintf(Buffer+length, "Good Morning"));
length += bytes_added(sprintf(Buffer+length, "Good Afternoon"));

  • Aber was passiert, wenn sprintf einen Konvertierungsfehler erfährt?

    anon

    20. April 2010 um 10:52 Uhr

  • Dann passieren schlimme Dinge. Die Fehlerprüfung habe ich der Kürze halber weggelassen.

    – Matthew T. Staebler

    20. April 2010 um 11:21 Uhr

  • +1 – Zusätzliche Fehlerprüfung sollte sowieso eine Übung für den Leser sein. Immerhin ist es ihr Code 🙂

    – Tim Post

    20. April 2010 um 12:28 Uhr

  • Ich denke, es ist sinnvoll, Fehler und Fehler im Falle eines negativen Ergebnisses von sprintf zu melden.

    – Boris Iwanow

    23. Oktober 2014 um 14:32 Uhr

Benutzeravatar von Oleg Razgulyaev
Oleg Razgulyaev

Zur Sicherheit (Pufferüberlauf) empfehle ich die Verwendung von snprintf()

const int MAX_BUF = 1000;
char* Buffer = malloc(MAX_BUF);

int length = 0;
length += snprintf(Buffer+length, MAX_BUF-length, "Hello World");
length += snprintf(Buffer+length, MAX_BUF-length, "Good Morning");
length += snprintf(Buffer+length, MAX_BUF-length, "Good Afternoon");

  • Das zweite Argument von snprintf ist unsigned (size_t). Dies bedeutet, dass wenn length > MAX_BUF ist, die MAX_BUF-length unterläuft und snprintf fröhlich außerhalb des Puffers schreibt und einen Pufferüberlauf erzeugt. Beachten Sie, dass die Rückgabe von snprintf gleich der Anzahl der Bytes ist, die geschrieben worden wären, wenn genügend Speicherplatz verfügbar gewesen wäre, und NICHT der Anzahl der tatsächlich geschriebenen Bytes.

    – leszek.hanusz

    14. Dezember 2016 um 17:18 Uhr

EIN snprintfcat() Hülle für snprintf():

size_t 
snprintfcat(
    char* buf,
    size_t bufSize,
    char const* fmt,
    ...)
{
    size_t result;
    va_list args;
    size_t len = strnlen( buf, bufSize);

    va_start( args, fmt);
    result = vsnprintf( buf + len, bufSize - len, fmt, args);
    va_end( args);

    return result + len;
}

Verwenden Sie den Rückgabewert von sprintf()

Buffer += sprintf(Buffer,"Hello World");
Buffer += sprintf(Buffer,"Good Morning");
Buffer += sprintf(Buffer,"Good Afternoon");

  • Dies ist die beste Lösung, keine Notwendigkeit zu strlen

    – tttony

    1. September 2018 um 14:59 Uhr

  • Beachten Sie, dass Sie auch die Startadresse des Puffers zur weiteren Bezugnahme speichern müssen.

    – Bersanri

    30. November 2018 um 12:05 Uhr

Benutzeravatar von SergGr
SergGr

Warum willst du verwenden sprintf für die Zeichenfolgenverkettung, wenn es Methoden gibt, die speziell für das, was Sie brauchen, gedacht sind, wie z strcat und strncat?

  • Dies ist die beste Lösung, keine Notwendigkeit zu strlen

    – tttony

    1. September 2018 um 14:59 Uhr

  • Beachten Sie, dass Sie auch die Startadresse des Puffers zur weiteren Bezugnahme speichern müssen.

    – Bersanri

    30. November 2018 um 12:05 Uhr

Kleines vollständiges Codebeispiel

Mit flacher Ebene Studio Nur Standardbibliothek

#include <stdio.h>
int main()
    {
    char c[1024];
    int  i=0;

    i+=sprintf(c+i,"We "   );
    i+=sprintf(c+i,"Love " );
       sprintf(c+i,"Coding");

    printf("%s",c);
    }

AUSGANG: Wir lieben Programmieren

1420040cookie-checkWie fügt man Strings mit sprintf an?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy