HOWTO · C

Prüfen, ob eine Zeichenkette eine Teilzeichenkette enthält in C

Dieser Artikel demonstriert, wie man in C prüft, ob eine Zeichenkette eine Teilzeichenkette enthält

Auf dieser Seite

Um zu prüfen, ob eine nullterminierte C-Zeichenkette eine exakte, zwischen Groß- und Kleinschreibung unterscheidende Teilzeichenkette enthält, rufen Sie strstr aus <string.h> auf. Die Funktion gibt einen Zeiger auf den ersten Treffer oder NULL zurück, wenn es keinen Treffer gibt. Jedes der folgenden Beispiele wurde ausgeführt und gab Substring found. aus; diese Beschriftung bleibt in den unveränderten Beispielen auf Englisch.

Mit strstr nach einer Teilzeichenkette suchen

Übergeben Sie die vollständige Zeichenkette als erstes Argument und den gesuchten Text als zweites. Prüfen Sie den zurückgegebenen Zeiger direkt. Geben Sie ihn nicht als Adresse aus, denn deren Wert hängt vom jeweiligen Prozess ab. strstr ist im standardmäßigen C-Header <string.h> deklariert und vergleicht Zeichen exakt, einschließlich Groß- und Kleinschreibung.

Dieses Programm sucht in einem Satz nach welcome und gibt eine eindeutige Meldung aus, ob der Text gefunden wurde.

#include <stdio.h>
#include <string.h>

int main(void) {
    const char *text = "Hello, welcome to C.";
    const char *needle = "welcome";

    if (strstr(text, needle) != NULL) {
        puts("Substring found.");
    } else {
        puts("Substring not found.");
    }
    return 0;
}
Substring found.

Der zurückgegebene Zeiger zeigt auf das erste passende Zeichen in text. Sie können ihn daher verwenden, um die Zeichenkette an dieser Stelle zu untersuchen oder die Suche von dort aus fortzusetzen. Ein Zeiger ungleich NULL bedeutet, dass ein Treffer vorliegt. Ist der Suchtext "", gibt strstr den Anfang von text zurück. Berücksichtigen Sie dieses standardmäßige Verhalten, falls eine leere Suchzeichenkette in Ihrer Anwendung nicht als Treffer zählen soll.

Mit einer Schleife nach einer Teilzeichenkette suchen

Eine manuelle Suche macht den Vergleichsablauf nachvollziehbar oder bietet eine Stelle für anwendungsspezifisches Verhalten. Die folgende Funktion erwartet zwei nicht-null Zeiger auf nullterminierte Zeichenketten. Sie gibt 1 zurück, wenn der Suchtext vorkommt, andernfalls 0. Bevor sie Längen voneinander abzieht, prüft sie diese. So vermeidet sie einen vorzeichenlosen Unterlauf, wenn der Suchtext länger als die Eingabe ist. Ein leerer Suchtext gilt wie bei strstr als Treffer.

#include <stdio.h>
#include <string.h>

int contains_substring(const char *text, const char *needle) {
    size_t text_len = strlen(text);
    size_t needle_len = strlen(needle);

    if (needle_len == 0) {
        return 1;
    }
    if (needle_len > text_len) {
        return 0;
    }

    for (size_t i = 0; i <= text_len - needle_len; ++i) {
        size_t j = 0;
        while (j < needle_len && text[i + j] == needle[j]) {
            ++j;
        }
        if (j == needle_len) {
            return 1;
        }
    }
    return 0;
}

int main(void) {
    const char *text = "Hello, welcome to C.";
    const char *needle = "welcome";

    puts(contains_substring(text, needle)
             ? "Substring found."
             : "Substring not found.");
    return 0;
}
Substring found.

Die äußere Schleife probiert jede Startposition aus, an der der gesamte Suchtext Platz hat. Die innere Schleife geht nur so lange weiter, wie die Zeichen an den jeweiligen Positionen übereinstimmen. Erreicht sie das Ende des Suchtexts, wurde eine vollständige Übereinstimmung gefunden. Diese einfache Methode eignet sich zum Lernen oder für eigene Anpassungen. Für gewöhnliche exakte Vergleiche ist die Standardbibliotheksfunktion vorzuziehen, sofern es keinen besonderen Grund gibt, eine eigene Suchfunktion zu pflegen.

Ohne Beachtung der Groß- und Kleinschreibung nach einer Teilzeichenkette suchen

Die C-Standardbibliothek definiert keine Funktion für die Suche nach Teilzeichenketten ohne Beachtung der Groß- und Kleinschreibung. Auf GNU-Systemen übernimmt strcasestr diese Suche; die Funktion ist eine GNU-Erweiterung. Definieren Sie _GNU_SOURCE vor dem Einbinden der Header, um ihre Deklaration auf Systemen anzufordern, die dieses Feature-Test-Makro verwenden. strcasestr gehört nicht zum portablen Standard-C. Prüfen Sie daher, ob die Zielplattform die Funktion bereitstellt, bevor Sie sich darauf verlassen.

Dieses vollständige Beispiel verwendet ASCII-Text und zeigt den GNU-spezifischen Aufruf. Es gibt Substring found. aus; diese Beschriftung bleibt im unveränderten Beispiel auf Englisch.

#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>

int main(void) {
    const char *text = "Hello, Welcome to C.";
    const char *needle = "welcome";

    if (strcasestr(text, needle) != NULL) {
        puts("Substring found.");
    } else {
        puts("Substring not found.");
    }
    return 0;
}
Substring found.

Implementieren Sie für portablen Code den Vergleich ohne Beachtung der Groß- und Kleinschreibung mit einer ausdrücklich festgelegten Zeichenrichtlinie, anstatt die Eingabezeichenketten unbemerkt zu verändern. Die Funktion tolower kann bei textorientierter Byteverarbeitung helfen. Ihr Argument muss jedoch entweder EOF oder als unsigned char darstellbar sein; außerdem richtet sich ihr Verhalten nach dem aktiven C-Gebietsschema. Damit wird Unicode-Fallfaltung nicht automatisch unterstützt. Wählen Sie eine Bibliothek und eine Textverarbeitung, die zu den Daten passen, mit denen Ihr Programm arbeiten soll.

Randfälle behandeln und eine Methode auswählen

Sowohl strstr als auch die obige Schleife durchsuchen nullterminierte Zeichenketten und vergleichen exakte Zeichenfolgen. Ist der Suchtext länger als der zu durchsuchende Text, kann es keinen Treffer geben. Bei einem leeren Suchtext meldet strstr einen Treffer am Anfang; die obige Schleifenimplementierung verwendet dieselbe Konvention. Fügen Sie eine ausdrückliche Prüfung hinzu, wenn Ihre Anwendung eine andere Regel benötigt. Die Schleife setzt nicht-null Zeiger voraus, ebenso wie Standardfunktionen für Zeichenketten gültige Argumente erwarten.

strstr gibt das erste Vorkommen zurück. Um weitere Vorkommen zu finden, setzen Sie die Suche hinter dem vorherigen Treffer fort, indem Sie dessen Zeiger um die Länge des Suchtexts verschieben. Stellen Sie dabei sicher, dass der Suchtext nicht leer ist, damit die nächste Suche vorankommt. Sind überlappende Treffer relevant, rücken Sie vom vorherigen Treffer aus nur um ein Zeichen weiter. Welche Variante passt, hängt davon ab, ob sich Treffer Zeichen teilen dürfen.

Verwenden Sie strstr für die übliche exakte Suche unter Beachtung der Groß- und Kleinschreibung: Der Aufruf ist kurz und gehört zum C-Standard. Eine manuelle Schleife eignet sich, wenn Sie den Vergleich vermitteln oder anpassen möchten; dokumentieren Sie dabei die Voraussetzungen für die Eingaben. Verwenden Sie strcasestr nur, wenn die GNU-Erweiterung verfügbar ist und ihr Verhalten bei Bytes und Gebietsschema zu Ihrem Text passt. strpbrk ist keine Alternative für die Suche nach einer exakten Teilzeichenkette: Die Funktion prüft, ob irgendein Zeichen aus einer Menge in der Eingabe vorkommt, und beantwortet damit eine andere Frage.