Die strstr
Funktion stammt aus einer Zeit zurück, bevor es so etwas wie ein Zeiger const
war. In Fällen, in denen Code in den Speicher geschrieben werden könnte, der durch den ersten an strstr
übergebenen Zeiger identifiziert wird, wäre es legal, dass Code in den vom zurückgegebenen Zeiger identifizierten Speicher schreibt, und in Fällen, in denen der zurückgegebene Wert nur verwendet würde Möglichkeiten, die mit einem Zeiger auf einen Nur-Lese-Speicher legal waren (zB ein String-Literal), könnte man einen solchen Zeiger legal an strstr
übergeben.
Wenn heute eine ähnliche Funktionalität wie strstr
definiert wurde, könnte sie mit zwei Methoden implementiert werden - eine davon könnte jeden Zeiger akzeptieren und einen Zeiger zurückgeben, der vom Empfänger nicht geschrieben werden konnte und nur einer davon Akzeptieren schreibbare Zeiger, würde aber einen Zeiger zurückgeben, den der Empfänger verwenden könnte, wie er es für richtig hält. Weil ein Code, der strstr
verwendet, nur Lesezeiger übergeben müsste, und weil ein Code, der strstr
verwendet, in der Lage wäre, in die Zeiger zu schreiben, die er liefern würde, wenn schreibbare Zeiger gegeben würden, war es notwendig, einen Satz von zu haben Zeigerqualifikationen funktionieren in beiden Richtungen. Die Konsequenz ist eine Reihe von Zeigerqualifikationen, die nicht wirklich "sicher" sind [da sie einen schreibbaren Zeiger auf einen schreibgeschützten Bereich des Speichers zurückgeben können] und der Code in einigen Fällen kompiliert, in denen er wirklich "nicht" sollte. aber das erlaubt Code, der vor den Tagen von const
-Zeigern geschrieben wurde, weiter zu arbeiten, wie beabsichtigt.
Sie enthalten Cstring und nicht String.h? Ansonsten verwenden Sie C-Versionen - Gott weiß, was sie tun. Die C++ 'std :: strstr 'Versionen geben nur' char * 'zurück, wenn der erste Parameter auch ein Nicht-' const' 'char *' ist. Siehe [hier] (http://en.cppreference.com/w/cpp/string/byte/strstr). (Entschuldigung - habe gerade das C-Tag bemerkt ... welche Sprache benutzt du eigentlich?) –
@TonyD Die C-Version ist 'char * strstr (const char *, const char *); ' –
Beachten Sie, dass es in C++ zwei Überladungen von strstr gibt (http://www.cplusplus.com/reference/cstring/strstr/) eine mit const char * -Parameter und eine mit normalem char * und die Rückgabewerte Folgen. –