strcat() vs. sprintf()

Lesezeit: 2 Minuten

Benutzeravatar von lxe
lxe

Was wäre schneller? Das:

sprintf(&str[strlen(str)], "Something");

oder

strcat(str, "Something");

Gibt es einen Leistungsunterschied?

  • @Jonathan Feinberg – Ist das nicht teilweise der Sinn von Stack Overflow? Sicher, er könnte wahrscheinlich einen Leistungstest auf die Beine stellen, aber wenn es schon jemand anders gemacht hat, warum sollte man dann das Rad neu erfinden?

    – Graeme Perrow

    20. November 2009 um 19:16 Uhr

  • Bitte beachten Sie, dass die Verwendung von sprintf sinnvoll ist sprintf(str, "%s", other_str) und nicht sprintf(str, other_str) Andernfalls riskieren Sie möglicherweise eine Sicherheitslücke in der Formatzeichenfolge

    – abyx

    20. November 2009 um 19:18 Uhr

Benutzer-Avatar von Justin Rudd
Justin Rudd

strcat wäre schneller, weil sprintf muss zuerst die Zeichenfolge nach Formatvariablen durchsuchen.

Aber der wahre Gewinn ist die Tatsache, dass jeder weiß, was strcat tut – Zeichenfolgen verketten. Benutzen sprintf denn Verkettung ist keine Standardverwendung. Und es würde dazu führen, dass die Leute doppelt hinsehen.

Wenn ich die Wahl zwischen beiden hätte, würde ich mich entscheiden strcat; Es ist auf jeden Fall besser lesbar und macht Ihre Absichten klarer. Es könnte auch etwas schneller sein als sprintfaber wahrscheinlich nicht viel.

Doch egal für welche Methode Sie sich entscheiden, Sie sollten diese unbedingt nutzen snprintf oder strncpy zum Schutz vor Pufferüberlauf.

Sie haben diese Frage als beides markiert c Und c++; Wenn Sie C++ verwenden, wäre es weitaus besser, a zu verwenden std::string stattdessen.

  • strncpy() kann dazu führen, dass Sie kein Terminator verwenden. strlcpy() oder strlcat() wären besser.

    – Randy Proctor

    20. November 2009 um 19:23

Benutzeravatar von pmg
pmg

Wenn es einen Unterschied gibt, variiert dieser Unterschied je nach Compiler-Flags, Computernutzung zum Zeitpunkt der Ausführung des Codes, Bibliotheksimplementierung usw.

Für Ihren konkreten Fall: messen.
Führen Sie beide Snippets ein paar Milliarden Mal aus und messen Sie sie zeitlich.

Ich bezweifle sehr, dass Sie einen signifikanten Unterschied feststellen werden.

Ich mag strcat() Besser: Es vermittelt klar die Bedeutung des Codes.

Benutzeravatar von user172818
Benutzer172818

Ich stimme anderen zu: strcat() sollte schneller sein. Aber als „Best-Practice“ sollten Sie keines von beiden verwenden, wenn Ihnen die Geschwindigkeit wirklich am Herzen liegt. Sie sollten besser eine Struktur wie diese haben:

typedef struct { size_t len, max; char *str; } mystring_t;

um das Ende der Zeichenfolge im Auge zu behalten. Wenn Sie eine Zeichenfolge anhängen, springen Sie einfach zum Ende und kopieren Sie sie. Doppelt max wenn der zugewiesene Speicher nicht groß genug ist. Alternativ können Sie auch etwas Ausgefallenes einpacken len, max Und str zusammen.

Benutzer-Avatar von Paul Hsieh
Paul Hsieh

strcat ist in diesem Fall viel schneller. Erinnere dich daran sprintf() Analysiert die Formatzeichenfolge Zeichen für Zeichen und sucht nach %-Escapezeichen. Vergleichen Sie dies mit:

strcpy (str + strlen (str), "Something");

Zum Beispiel.

1453000cookie-checkstrcat() vs. sprintf()

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

Privacy policy