Warum gibt es keine strnchr-Funktion?

Lesezeit: 3 Minuten

Wie die andere C-Bibliotheksfunktion, like strcpy, strcatgibt es eine Version, die die Größe der Zeichenkette begrenzt (strncpyetc.), frage ich mich, warum es keine solche Variante für gibt strchr?

  • Warum sollten Sie es brauchen? Was macht memchr() mach das nicht strnchr() 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 Hypothetischen strnchr(). 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

Benutzer-Avatar
Sören

Es existiert – es heißt memchr:

http://en.wikipedia.org/wiki/C_string_handling

  • Beachten Sie, dass memchr ist nicht genau was man erwarten könnte strnchr könnte tun, da memchr stoppt nicht am Ende der Zeichenfolge, wenn diese kürzer als die ist n -Argument (d. h. es kann Bytes jenseits von lesen \0nicht wie strchr). Das “n-weniger” Äquivalent von memchr ist nicht strchraber rawmemchreine 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() und printf("%.*s", n, s);. Beachten Sie, dass eine richtige Manpage für strncmp 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 Umsetzung printfwenn 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

1335610cookie-checkWarum gibt es keine strnchr-Funktion?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy