Scheint strncmp
wird normalerweise empfohlen als strcmp
, was sind die Vorteile? Ich denke, es könnte mit Sicherheit zusammenhängen. Wenn dies der Fall ist, ist es immer noch anwendbar, wenn bekannt ist, dass eine der Eingabezeichenfolgen eine Literalkonstante ist, wie "LiteralString"
?
UPDATE:
Ich meine unter dem gleichen Benutzerszenario, in dem ganze Zeichenfolgen verglichen werden müssen, und strncmp
kann wie unten benutzt werden. Ich frage mich, ob es Sinn macht oder nicht.
Das Problem mit strcmp
besteht manchmal darin, dass fälschlicherweise übergebene Argumente keine gültigen C-Zeichenfolgen sind (dh, dass p1 oder p2 nicht mit einem Nullzeichen abgeschlossen ist, dh nicht NULL -terminierte Zeichenfolge ), dann strcmp weiter Vergleich, bis es nicht zugänglichen Speicher erreicht und abstürzt oder manchmal zu einem unerwarteten Verhalten führt.
Mit strncmp
können Sie die Suche einschränken, so dass sie nicht zugänglichen Speicher erreicht.
Aber davon sollte nicht gesagt werden, dass strcmp
unsicher ist. Beide Funktionen funktionieren gut in der Art, wie sie funktionieren sollen. Programmierer sollten die Seite man
für diese Funktion lesen, bevor sie sie verwenden, und sie muss aufrichtig genug sein, um Parameter an solche Bibliotheksfunktionen zu übergeben.
Sie können auch DIES lesen, das fast enthält ähnliche Frage.
strncmp
hat keine "Vorteile gegenüber strcmp
"; eher lösen sie verschiedene Probleme. strcmp
dient zum Bestimmen, ob zwei Zeichenfolgen gleich sind (und falls nicht, möglicherweise wie sie zueinander angeordnet / sortiert werden sollen). strncmp
dient (hauptsächlich) zum Bestimmen, ob eine Zeichenfolge mit einem bestimmten Präfix beginnt. Zum Beispiel:
bestimmt, ob str
mit "--option="
beginnt. Dies kann nicht durch strcmp
erreicht werden, ohne die zu überprüfende Zeichenkette (die möglicherweise keine gültige Operation ist) zu modifizieren oder eine nutzlose Kopie davon zu erstellen. Es kann auch nicht mit memcmp
erreicht werden, es sei denn, Sie kennen str
bereits auf ein Objekt mit mindestens 9 Byte Länge; andernfalls hätte der Aufruf von memcmp
ein undefiniertes Verhalten.
Es gibt auch andere Verwendungsfälle für strncmp
, wie zum Beispiel das Arbeiten mit Nicht-C-String-Daten.
Veröffentlichen Sie hier einfach einen Anti-Strncmp-Anwendungsfall. Denken Sie über den folgenden Code nach.
%Vor%nehme an: dev1 ist null terminiert und dev2 ist wahrscheinlich nicht. ret1 = 0 (falsch positives Ergebnis), statt ret2 = -1 (gültiges Ergebnis)
fazit: strncmp ist nicht nur ein sicherer Weg für strcmp. hängt davon ab, wie Sie es nutzen.
Ich würde strcmp für Strings und strncmp für die Substring-Suche verwenden.
strcmp könnte zu Speichervolation und Segmentierungsfehlern führen, wenn eines der Argumente keine nullterminierte Zeichenfolge ist. Sehen Sie sich an, warum Sie strncpy anstelle von strcpy verwenden sollten . Es ist unwahrscheinlich, dass Konsequenzen in strcmp auftreten, aber das Problem ist das gleiche. strnxxx Funktionsfamilie versuchen, das Lesen / Schreiben nicht erworbenen Speicher zu verhindern.
Nachteil der Verwendung von strn ist die zusätzliche Vergleichs- und Dekrementierungsoperation auf dem Zähler.
In wenigen Worten: strncmp ist sicherer als strcmp, aber es ist auch langsamer.
Ich konnte nur einen Vorteil sehen, dass strncmp etwas weniger Zeit für die Ausführung braucht als strcmp, da wir das Präfix der Zeichenkette immer mit dem Vergleich vergleichen und nicht mit der ganzen Zeichenkette.
Ich glaube nicht, dass der strcmp- und strncmp-Algorithmus irgendwelche Sicherheitsaspekte beinhaltet. Sie sind die gleichen, außer dass in strncmp nur die ersten 'n' Zeichen verglichen werden.
strncmp ist sicherer als strcmp
wie strncpy und strcpy oder strlen und strnlen, weil strcmp vergleicht, bis der erste Zeroerminator gefunden wird. strncmp vergleicht bis zum ersten Zerterminator, aber maximal n Zeichen. Wenn Ihre Zeichenfolge eine definierte Länge hat, ist es besser, die strn * -Funktionen zu verwenden.
Siehe auch
Tags und Links c c-standard-library