2016-07-31 4 views
1

DoesDie Verwendung von strncmp und memcmp

if(strncmp(buf, buf2, 7) == 0) 

das gleiche tun wie

if(memcmp(buf, buf2, 7) == 0) 

buf und buf2 sind char * Arrays oder ähnliches.

Ich wollte das an eine andere Frage anhängen, aber entschied dann vielleicht, es wäre besser, es separat zu veröffentlichen. Vermutlich ist die Antwort entweder ein triviales "Ja" oder wenn nicht, was ist der Unterschied?

(fand ich diese Funktionen von Online-Dokumentation, war aber über strncmp nicht sicher, weil die Dokumentation etwas unklar war.)

Antwort

1

In C und C++ das Ende einer Zeichenkette durch ein Byte mit dem Wert 0 angezeigt wird. Die Funktion memcmp interessiert sich nicht für das Ende einer Strig, sondern wird in jedem Fall genau die Anzahl der angegebenen Bytes vergleichen.

Im Gegensatz dazu stoppt die Funktion strncmp bei einem Byte mit dem Wert 0, obwohl die übergebene Anzahl der zu vergleichenden Bytes noch nicht erreicht ist.

+0

Ach ja natürlich - sollte das in meiner Frage notiert haben – user3728501

+1

Zusätzlich zu der Funktionalität der Methode kann die Implementierung von Memcmp() in der Tat anders sein, dass es entworfen werden kann, in Bezug auf ganze Wörter während arbeiten strncmp() wird wahrscheinlich nur mit Byte-Reads implementiert. Wenn Leistung ein Problem ist, kann Memcmp() schneller sein. – MoDJ

+0

Danke das ist auch nützlich zu wissen – user3728501

2

Wie strcmp(), strncmp() ist für den Vergleich Strings daher zu vergleichen es stoppt, wenn er in mindestens ein Argument einen String-Terminator findet. Irgendwelche Unterschiede nach diesem Punkt haben keine Auswirkung auf das Ergebnis. strncmp() unterscheidet sich dadurch, dass es auch nach der angegebenen Anzahl von Bytes den Vergleich unterbricht, wenn es davor keinen Terminator gibt.

memcmp(), auf der anderen Seite, ist für den Vergleich von Blöcken des Zufallsspeichers. Es vergleicht bis zur angegebenen Anzahl von Bytes von jedem Block, bis es einen Unterschied findet, unabhängig von den Werten der Bytes. Das heißt, es hört nicht bei String-Terminatoren auf.

+0

Beide gute Antworten danke – user3728501

0

Der wesentliche Unterschied zwischen strncmp() und memcmp() ist, dass die erste vernünftige, ist (stoppt at) '\0', wo die letzte nicht ist. Wenn die ersten 7 Bytes des Speichers von buf und buf2 darin kein '\0' enthalten, dann ist das Verhalten das gleiche.

Betrachten Sie das folgende Beispiel:

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    char buf[] = "123\0 12"; 
    char buf2[] = "123\0 34"; 

    printf("strncmp(): %d\n", strncmp(buf, buf2, 7)); 
    printf("memcmp(): %d\n", memcmp(buf, buf2, 7)); 

    return 0; 
} 

Es wird ausgegeben:

strncmp(): 0 
memcmp(): -2 

Da strncmp() bei buf[3] stoppen, wo es eine '\0' finden, wo memcmp(), bis alle 7 Bytes fortgesetzt werden verglichen.

Verwandte Themen