Tutte le stringhe possono essere considerate una matrice di caratteri ( Sì ), tutte le matrici di caratteri possono essere considerate stringhe ( No ).
Perchè no? e perché è importante?
Oltre alle altre risposte che spiegano che la lunghezza di una stringa non è memorizzata da nessuna parte come parte della stringa e i riferimenti allo standard in cui è definita una stringa, il rovescio della medaglia è "In che modo le funzioni della libreria C gestiscono le stringhe?"
Mentre una matrice di caratteri può contenere gli stessi caratteri, è semplicemente una matrice di caratteri a meno che l'ultimo carattere sia seguito dal carattere che termina con null . Quel carattere che termina l'annullamento è ciò che consente alla matrice di caratteri di essere considerata (gestita come) una stringa.
Tutte le funzioni in C che prevedono una stringa come argomento prevedono che la sequenza di caratteri venga annullata . Perché?
Ha a che fare con il modo in cui funzionano tutte le funzioni di stringa. Poiché la lunghezza non è inclusa come parte di un array, funzioni stringa, scansiona in avanti nell'array fino a trovare il carattere nullo (es. '\0'
- equivalente al decimale 0
). Vedi tabella e descrizione ASCII . Indipendentemente se si sta utilizzando strcpy
, strchr
, strcspn
, ecc .. Tutte le funzioni di stringa si affidano alla nul-terminazione carattere essere presenti per definire dove alla fine di quella stringa è.
Un confronto tra due funzioni simili string.h
enfatizzerà l'importanza del carattere nulconsente . Prendi ad esempio:
char *strcpy(char *dest, const char *src);
La strcpy
funzione copia semplicemente i byte da src
a dest
fino a quando non viene trovato il carattere che termina con il nulla che dice strcpy
dove interrompere la copia dei caratteri. Ora prendi la funzione simile memcpy
:
void *memcpy(void *dest, const void *src, size_t n);
La funzione esegue un'operazione simile, ma non considera o richiede che il src
parametro sia una stringa. Poiché memcpy
non è possibile eseguire semplicemente la scansione in avanti durante la src
copia dei byte dest
fino a quando non viene raggiunto un carattere che termina con null , è necessario copiare un numero esplicito di byte come terzo parametro. Questo terzo parametro fornisce memcpy
informazioni della stessa dimensione in strcpy
grado di derivare semplicemente scansionando in avanti fino a trovare un carattere che termina con null .
(che sottolinea anche cosa non strcpy
funziona (o qualsiasi funzione che si aspetta una stringa) se non si riesce a fornire alla funzione una stringa con terminazione nulla - non ha idea di dove fermarsi e correrà felicemente attraverso il resto del segmento di memoria invocare Undefined Behaviour finché non viene trovato un carattere nullo da qualche parte nella memoria o si verifica un errore di segmentazione)
Ecco perché le funzioni che prevedono una stringa con terminazione null devono passare una stringa con terminazione null e perché sono importanti .
char str[] = "hello";
caso.