Ich versuche zu überprüfen, ob eine Zeichenfolge eine Teilzeichenfolge in C enthält, wie:
char *sent = "this is my sample example";
char *word = "sample";
if (/* sentence contains word */) {
/* .. */
}
Was kann anstelle von string::find
C ++ verwendet werden?
strchr
.Antworten:
Beachten Sie, dass
strstr
ein Zeiger auf den Wortanfang in zurückgegeben wird,sent
wenn das Wortword
gefunden wird.quelle
strstr
gibt einen Zeiger zurück; Ich mag es explizit zu sein, wenn ich auf Zeiger teste.false
ist0
strcasestr
macht das Gleiche, ignoriert aber den Fall.strstr
in glibc hier sehen: github.com/lattera/glibc/blob/master/string/strstr.c . Es ist viel optimierter als eine naive Implementierung - und wahrscheinlich schneller als eine einfache selbst definierte Funktion. Trotzdem im Zweifelsfall Benchmark.Verwenden Sie
strstr
dazu.http://www.cplusplus.com/reference/clibrary/cstring/strstr/
Also würdest du es schreiben wie ..
quelle
Versuchen Sie, Zeiger zu verwenden ...
quelle
Sie können dies versuchen, um das Vorhandensein des Teilstrings zu ermitteln und ihn zu extrahieren und zu drucken:
quelle
if(strcmp((ret=strstr(mainstring,substring)),substring))
ist falsch: Er stimmt nur überein,substring
wenn es sich um ein Suffix von handeltmainstring
. Der Rest der Funktion ist eine verschlungene Schreibweiseprintf("and the sub string is:::%s\n", substring);
.Dieser Code implementiert die Logik, wie die Suche funktioniert (eine der Möglichkeiten), ohne eine vorgefertigte Funktion zu verwenden:
quelle
Und so melden Sie die Position des ersten Zeichens von der gefundenen Teilzeichenfolge:
Ersetzen Sie diese Zeile im obigen Code:
mit:
quelle
Meine eigene bescheidene (Groß- und Kleinschreibung beachtende) Lösung:
Ergebnisse
Getestet auf ATmega328P (avr8-gnu-toolchain-3.5.4.1709);)
quelle
Dasselbe wird mit diesem einfacheren Code erreicht: Warum diese verwenden:
Der schwierige Teil wäre jedoch zu melden, an welcher Position in der ursprünglichen Zeichenfolge der Teilstring beginnt ...
quelle
quelle
Ich glaube, dass ich die einfachste Antwort habe. Sie benötigen weder die Bibliothek string.h in diesem Programm noch die Bibliothek stdbool.h. Die einfache Verwendung von Zeigern und Zeigerarithmetik hilft Ihnen, ein besserer C-Programmierer zu werden.
Geben Sie einfach 0 für False (kein Teilstring gefunden) oder 1 für True (ja, ein Teilstring "sub" befindet sich in der Gesamtzeichenfolge "str") zurück:
quelle
char a[3] = "asd"; char b[2] = "as"; is_substr(a, b);
Eingabezeichenfolgen sind nicht NUL-terminiert, sodass Sie das Array überlaufen.char a[4] = "asd"; char b[3]= "as"; is_substr(a+4, b);
strnstr()
, warum es existiert (zumindest auf libbsd)Verwenden von C - Keine integrierten Funktionen
string_contains () erledigt das ganze schwere Heben und gibt 1 basierten Index zurück. Rest sind Fahrer- und Helfercodes.
Weisen Sie der Hauptzeichenfolge und dem Teilstring einen Zeiger zu, erhöhen Sie den Teilstringzeiger beim Abgleich und beenden Sie die Schleife, wenn der Teilstringzeiger der Teilstringlänge entspricht.
read_line () - Ein kleiner Bonuscode zum Lesen der Benutzereingaben, ohne die Größe der Eingabe festzulegen, die der Benutzer bereitstellen sollte.
quelle
quelle