Was ist die richtige Funktion zum Vergleichen zweier Zeichenfolgen im C-Stil?

Lesezeit: 3 Minuten

Was ist die richtige Funktion zum Vergleichen zweier Zeichenfolgen im
Ren

Ich habe also ein Dilemma. Ich muss zwei Strings im C-Stil vergleichen und habe nach den Funktionen gesucht, die am besten geeignet wären:

memcmp   //Compare two blocks of memory (function)
strcmp   //Compare two strings (function )
strcoll  //Compare two strings using locale (function)
strncmp  //Compare characters of two strings (function)
strxfrm  //Transform string using locale (function)

Das erste, denke ich, ist für Adressen, also ist die Idee raus. Der zweite klingt für mich nach der besten Wahl, aber ich möchte trotzdem Feedback hören. Die anderen drei lassen mich ratlos zurück.

  • “Der erste, denke ich, ist für Adressen” – Nein, es ist für beliebige Speicherblöcke. Am Ende nehmen all diese Funktionen Adressen, die auf die zu vergleichenden Speicherblöcke zeigen. Aber keiner vergleicht wirklich Adressen. Aber aus Ihren In-Code-Kommentaren geht hervor, dass Sie sich dessen bewusst sind und sich nur etwas ungenau ausgedrückt haben.

    – Christian Rau

    19. Dezember 2012 um 15:23 Uhr

Für allgemeine Zeichenkettenvergleiche strcmp ist die passende Funktion. Du solltest benutzen strncmp um nur eine bestimmte Anzahl von Zeichen aus einer Zeichenfolge (z. B. ein Präfix) zu vergleichen, und memcmp Speicherblöcke zu vergleichen.

Da Sie jedoch C++ verwenden, sollten Sie dies ganz vermeiden und die verwenden std::string -Klasse, die viel einfacher zu verwenden und im Allgemeinen sicherer ist als Zeichenfolgen im C-Stil. Sie können zwei vergleichen std::strings für Gleichheit ganz einfach, indem Sie einfach die verwenden == Operator.

Hoffe das hilft!

  • Danke, würde ich gerne, aber im Moment beschränkt uns unser Professor darauf, nur C-Saiten zu verwenden.

    – Ren

    3. Februar 12 um 0:52 Uhr

  • Suchen Sie nach dem C-Plus-Funktionscode und lesen Sie ihn … vielleicht würden Sie eine Überraschung finden. Und @templatetypedef Ich denke, dass == in diesem Fall imho nicht der Ritus-Operator ist.

    – crsuarezf

    3. Februar 12 um 16:56 Uhr


  • @ingcarlos- Sie haben Recht, dass Sie hier kein == verwenden sollten. Mein Vorschlag ist, zu std::string von C++ zu wechseln, in diesem Fall ist der Operator == der richtige Weg.

    – Vorlagentypdef

    3. Februar 12 um 18:47 Uhr

Beide memcmp und strcmp wird gut funktionieren. Um Ersteres zu verwenden, müssen Sie die Länge der kürzeren Zeichenfolge im Voraus kennen.

  • Wenn Sie anrufen memcmp mit der Länge der ehemaligen Saite, dann wird es Ihnen das sagen "abc" und "abcdef" sind gleich. Sie könnten ihm die Länge der kürzeren Zeichenfolge plus eins übergeben (und es wird die sehen und vergleichen '' Terminator) — aber seit strcmp wurde speziell zum Vergleichen von Zeichenfolgen entwickelt, das sollten Sie verwenden.

    – Keith Thompson

    3. Februar 12 um 0:21 Uhr


  • Dem würde ich alles zustimmen, ja.

    – Karl Norum

    3. Februar 12 um 0:22 Uhr

  • Weiß jemand ob memcmp kann schneller sein, beispielsweise weil die Länge im Voraus bekannt ist und daher eine gewisse Optimierung ermöglicht wird, indem zunächst die Wortlängenabschnitte betrachtet werden?

    – Keith

    3. Februar 12 um 0:23 Uhr

  • @Keith: Vielleicht, vielleicht auch nicht. Vertrauen Sie Ihrer Laufzeitbibliothek und verwenden Sie die Funktion that bedeutet was du willst. Versuchen Sie nicht, den Compiler zu überlisten.

    – Greg Hewgill

    3. Februar 12 um 0:25 Uhr


.

666790cookie-checkWas ist die richtige Funktion zum Vergleichen zweier Zeichenfolgen im C-Stil?

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

Privacy policy