Come implementare strtol
in modo corretto?
non lo fate, perché la definizione 's strtol
non è intrinsecamente const
-correct.
Questo è un difetto nella libreria standard C.
Esistono diverse funzioni standard che accettano un argomento const char*
(si prevede che puntino all'inizio di un array di caratteri) e restituiscano un puntatore non const
char*
che può essere utilizzato per modificare quell'array.
strchr
è un esempio:
char *strchr(const char *s, int c);
Ad esempio:
comportamento
#include <string.h>
int main(void) {
const char *s = "hello";
char *ptr = strchr(s, 'h');
*ptr = 'H';
}
Questo programma è indefinito. Sul mio sistema, muore con un errore di segmentazione.
Il problema non si verifica nello stesso strchr
. Promette di non modificare la stringa che gli passi, e non lo fa. Ma restituisce un puntatore che il chiamante può quindi utilizzare per modificarlo.
Il comitato ANSI C, di nuovo alla fine del 1980, potrebbe hanno dividere ogni tale funzione in due versioni, una che agisce sul const
array di caratteri e un altro per i non const
array:
char *strchr(char *s, int c);
const char *strcchr(const char *s, int c);
Ma che avrebbe rotto il codice pre-ANSI esistente, scritto prima dello const
esistente. Questa è la stessa ragione per cui C non ha creato stringhe letterali const
.
C++, che eredita la maggior parte della libreria standard di C, si occupa di ciò fornendo versioni sovraccaricate di alcune funzioni.
La riga di fondo è che è, come programmatore C, sono responsabili per non modificare gli oggetti definiti come const
. Nella maggior parte dei casi, la lingua ti aiuta a far rispettare questo, ma non sempre.
Quanto a come queste funzioni riescono a restituire un puntatore non const
ai dati const
, probabilmente basta usare un cast internamente (non un const_cast
, che esiste solo in C++). Ciò presuppone che siano implementati in C, che è probabile ma non richiesto.
Che dire "giocare" con un offset prendendo come direzione 'str' di base? – kazbeel
Ci vorrebbe 'const char ** endptr' e abbiamo un'implementazione altrimenti uguale, ma vedi http://stackoverflow.com/questions/993700/are-strtol-strtod-unsafe perché no. –
La risposta è "non può". Questo è stato risposto in un'altra domanda più generale, però. – dasblinkenlight