c-standard-library

___ answer30192078 ___

%code% hat keine "Vorteile gegenüber %code% "; eher lösen sie verschiedene Probleme. %code% dient zum Bestimmen, ob zwei Zeichenfolgen gleich sind (und falls nicht, möglicherweise wie sie zueinander angeordnet / sortiert werden sollen). %code% dient (hauptsächlich) zum Bestimmen, ob eine Zeichenfolge mit einem bestimmten Präfix beginnt. Zum Beispiel:

%Vor%

bestimmt, ob %code% mit %code% beginnt. Dies kann nicht durch %code% 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 %code% erreicht werden, es sei denn, Sie kennen %code% bereits auf ein Objekt mit mindestens 9 Byte Länge; andernfalls hätte der Aufruf von %code% ein undefiniertes Verhalten.

Es gibt auch andere Verwendungsfälle für %code% , wie zum Beispiel das Arbeiten mit Nicht-C-String-Daten.

    
___ qstnhdr ___ Vorteile von strncmp gegenüber strcmp? ___ answer39541160 ___

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

%Vor%     
___ answer49145632 ___
%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.

    
___ answer30190520 ___

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

Das ist es.

    
___ answer30190966 ___

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.

    
___ answer30191350 ___

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.

    
___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ answer30190652 ___

Das Problem mit %code% 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 %code% können Sie die Suche einschränken, so dass sie nicht zugänglichen Speicher erreicht.

Aber davon sollte nicht gesagt werden, dass %code% unsicher ist. Beide Funktionen funktionieren gut in der Art, wie sie funktionieren sollen. Programmierer sollten die Seite %code% 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.

    
___ tag123cstandardbibliothek ___ Die C-Standardbibliothek ist die Standardbibliothek für die Programmiersprache C, wie im ANSI C-Standard spezifiziert ___ answer30190628 ___

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

Ссылка

    
___ qstntxt ___

Scheint %code% wird normalerweise empfohlen als %code% , 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 %code% ?

UPDATE: Ich meine unter dem gleichen Benutzerszenario, in dem ganze Zeichenfolgen verglichen werden müssen, und %code% kann wie unten benutzt werden. Ich frage mich, ob es Sinn macht oder nicht.

%Vor%     
___
8
Antworten

Vorteile von strncmp gegenüber strcmp?

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 e...
12.05.2015, 12:10