Nie można wdrożyć strstr()
bez naruszania w jakikolwiek sposób poprawności const
. Gips to najprostszy sposób na zrobienie tego. Prawdopodobnie możesz jakoś ukryć naruszenie (na przykład możesz użyć wartości memcpy()
, aby skopiować wartość wskaźnika), ale nie ma sensu tego robić.
Problemem jest to, że strstr()
zajmuje const char*
wskazujący na sznurku i zwraca niebędącą const
char*
wskazujący do tego samego łańcucha.
Na przykład, program:
#include <stdio.h>
#include <string.h>
int main(void) {
const char s[] = "hello";
char *result = strstr(s, "hello");
*result = 'H';
puts(result);
}
modyfikuje (lub przynajmniej próbuje modyfikować) ą const
-qualified obiektów bez stosowania gips lub inny wskaźnik oczywiście niebezpieczne konstrukcję.
Powrót w 1989 roku, komitet ANSI C mógłby uniknąć tego problemu poprzez zdefiniowanie dwie różne funkcje, np:
const char *strcstr(const char *haystack, const char *needle);
char *strstr ( char *haystack, const char *needle);
jedną, która zwraca wskaźnik do const char
otrzymał const
argumenty, a inny, że zwraca wskaźnik do modyfikowalnego char
ze względu na modyfikowalny argument. (C++, który dziedziczy bibliotekę standardową C, robi to przez przeciążanie.)
strstr()
to jedna z kilku standardowych funkcji napisów, które mają ten problem.
Nie musisz niczego modyfikować (?) – sircodesalot
@sircodesalot Jak właściwie * zapisujesz * funkcję bez odrzucania 'const' w celu zwrócenia wskaźnika? – Ana
Zgadzam się z tobą. Typem zwracanym powinno być 'const char *'. – user3386109