Wie die andere C-Bibliotheksfunktion, like strcpy
, strcat
gibt es eine Version, die die Größe der Zeichenkette begrenzt (strncpy
etc.), frage ich mich, warum es keine solche Variante für gibt strchr
?
Warum gibt es keine strnchr-Funktion?
Sören
Es existiert – es heißt memchr
:
-
Beachten Sie, dass
memchr
ist nicht genau was man erwarten könntestrnchr
könnte tun, damemchr
stoppt nicht am Ende der Zeichenfolge, wenn diese kürzer als die istn
-Argument (d. h. es kann Bytes jenseits von lesen\0
nicht wiestrchr
). Das “n-weniger” Äquivalent vonmemchr
ist nichtstrchr
aberrawmemchr
eine GNU-Erweiterung, die weder POSIX noch C99 ist.– anol
21. September 2015 um 13:24 Uhr
-
So
#define strnchr(haystack, needle, length) memchr(haystack, needle, strnlen(haystack, length))
sollte man machen oder?– herzi
6. Juli 2017 um 9:55 Uhr
In C bedeutet der Begriff “String” normalerweise “nullterminiertes Array von Zeichen”, und die str*
Funktionen arbeiten mit dieser Art von Zeichenfolgen. Das n
bei den von dir erwähnten funktionen geht es hauptsächlich um die steuerung Ausgang.
Wenn Sie willkürlich operieren möchten Byte Sequenz ohne implizite Terminierungssemantik, verwenden Sie die mem*
Familie von Funktionen; in Ihrem Fall memchr
sollte deinen Bedürfnissen dienen.
-
Guter Einblick, aber Beispiele für vorhandene Funktionalität, bei der eine Grenze für eine Eingabezeichenfolge bereitgestellt wird
strncmp()
undprintf("%.*s", n, s);
. Beachten Sie, dass eine richtige Manpage fürstrncmp
würde vermeiden zu sagen, dass es Zeichenketten als Argument braucht, aber die BSD- und GNU-Manpages sind in dieser Hinsicht etwas schlampig. Die C-Norm hingegen ist perfekt formuliert.– Pascal Cuoq
28. Juni 2014 um 15:26 Uhr
-
Auch die von POSIX
strnlen()
.– Pascal Cuoq
28. Juni 2014 um 15:34 Uhr
-
@PascalCuoq: Interessant. Ich würde wahrscheinlich zweimal auf jeden Algorithmus schauen, der angeblich ein guter Anwendungsfall für ist
strnlen
.– Kerrek SB
28. Juni 2014 um 15:51 Uhr
-
Ein Anwendungsfall für
strnlen
ist, bei der Umsetzungprintf
wenn sowohl eine Breite als auch eine Genauigkeit für ein Zeichenfolgenformat angegeben wurden, um die Anzahl der führenden Leerzeichen zu berechnen, die gedruckt werden sollten.– Pascal Cuoq
28. Juni 2014 um 16:00 Uhr
strnchr und auch strnlen sind zum Beispiel in einigen Linux-Umgebungen definiert https://manpages.debian.org/experimental/linux-manual-4.11/strnchr.9.en.html. Es ist wirklich notwendig. Ein Programm kann am Ende des Speicherbereichs abstürzen, wenn strlen oder strcmp keine \0-Terminierung finden. Leider werden solche Dinge oft nicht oder zu spät und zu ausgefeilt standardisiert. strnlen_s ist in C11 vorhanden, aber strnchr_s ist nicht verfügbar.
Weitere Informationen zu solchen Problemen finden Sie auf meiner Internetseite: https://www.vishia.org/emcdocu/html/portability_emC.html. Ich habe einige C-Funktionen strnchr_emC… etc. definiert, die die erforderliche Funktionalität liefern. Um Kompatibilität zu erreichen, können Sie definieren
#define strnchr strnchr_emC
In einem gemeinsamen Header, aber plattformspezifisch. Verweisen Sie auf den weiteren Inhalt https://www.vishia.org/emc/. Die Quellen findest du in https://github.com/JzHartmut
Warum sollten Sie es brauchen? Was macht
memchr()
mach das nichtstrnchr()
würdest du?– Jonathan Leffler
28. Juni 2014 um 12:52 Uhr
@JonathanLeffler Vermutlich
strnchr()
würde aufhören, sobald entweder der Terminator getroffen wurde oder die maximale Länge wurde erreicht.strchr_s
könnte ein besserer Name sein. Aber natürlich haben Sie schon verloren, wenn Sie einen übergelaufenen String in Ihrem Datensatz haben.– Sneftel
28. Juni 2014 um 12:55 Uhr
@Sneftel: Hmmm … interessant … Wenn Sie nicht wissen, wie lang die nullterminierte Zeichenfolge ist, aber wissen, dass sie nicht länger als N Bytes ist, und Sie nur daran interessiert sind, höchstens die ersten M Bytes zu durchsuchen, und M < N, aber die tatsächliche Länge der nullterminierten Zeichenfolge L könnte dann kleiner als M sein
memchr()
ist nicht ganz identisch mit dem Hypothetischenstrnchr()
. Legitim, wenn auch nicht sehr wahrscheinlich.– Jonathan Leffler
28. Juni 2014 um 13:07 Uhr
@JonathanLeffler Ja, ich würde es definitiv in die Kategorie “Eigene schreiben” der allgemeinen Hilfsfunktionen einordnen.
– Sneftel
28. Juni 2014 um 13:12 Uhr
@Sneftel: Ich stimme zu. Es könnte sinnvoll sein, eine solche Funktion zu haben.
– Rudy Velthuis
28. Juni 2014 um 13:12 Uhr