Non è possibile implementare strstr()
senza violare la correttezza const
in qualche modo. Un cast è il modo più semplice per farlo. Probabilmente puoi nascondere la violazione in qualche modo (ad esempio potresti usare memcpy()
per copiare il valore del puntatore), ma non ha senso farlo.
Il problema è che strstr()
prende un const char*
che punta a una stringa, e restituisce un non const
char*
che punta nella stessa stringa.
Ad esempio, questo programma:
#include <stdio.h>
#include <string.h>
int main(void) {
const char s[] = "hello";
char *result = strstr(s, "hello");
*result = 'H';
puts(result);
}
modifica (o almeno tentativi di modificare) un oggetto Qualificato const
, senza utilizzare un getto puntatore o qualsiasi altro costrutto ovviamente non sicura.
Nel 1989, il comitato ANSI C potrebbe potuto evitare questo problema, definendo due funzioni diverse, dire:
const char *strcstr(const char *haystack, const char *needle);
char *strstr ( char *haystack, const char *needle);
uno che restituisce un puntatore ad un const char
dato un const
argomenti, e un altro che restituisce il puntatore a un modificabile char
dato un argomento modificabile. (C++, che eredita la libreria standard C, lo fa sovraccaricando.)
strstr()
è una delle numerose funzioni di stringa standard che presentano questo problema.
fonte
2016-04-13 22:59:20
Non è necessario modificare nulla (?) – sircodesalot
@sircodesalot In che modo si * scrive * la funzione senza gettare via 'const' per restituire un puntatore? – Ana
Sono d'accordo con te. Il tipo di ritorno dovrebbe essere 'const char *'. – user3386109