Vorteile von strncmp gegenüber strcmp?

9

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.

%Vor%     
Thomson 12.05.2015, 12:10
quelle

8 Antworten

14

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.

    
Surajeet Bharati 12.05.2015 12:17
quelle
10

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:

%Vor%

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.

    
R.. 12.05.2015 13:16
quelle
8

Es kommt auf Ihre Anwendungsfälle an. Verwenden Sie strncmp , wenn Sie nur eine feste Anzahl von Zeichen vergleichen müssen, verwenden Sie strcmp , wenn Sie eine ganze Zeichenfolge vergleichen müssen.

Das ist es.

    
Some programmer dude 12.05.2015 12:12
quelle
0

Veröffentlichen Sie hier einfach einen Anti-Strncmp-Anwendungsfall. Denken Sie über den folgenden Code nach.

%Vor%     
user3099889 16.09.2016 22:58
quelle
0
%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.

    
user9455050 07.03.2018 06:36
quelle
-1

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.

    
M.L. 12.05.2015 12:31
quelle
-2

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.

    
nishant naveen 12.05.2015 12:47
quelle
-4

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

Ссылка

    
Miguel13366 12.05.2015 12:16
quelle

Tags und Links