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.henfatizzerà l'importanza del carattere nulconsente . Prendi ad esempio:
char *strcpy(char *dest, const char *src);
La strcpyfunzione copia semplicemente i byte da srca destfino a quando non viene trovato il carattere che termina con il nulla che dice strcpydove 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 srcparametro sia una stringa. Poiché memcpynon è possibile eseguire semplicemente la scansione in avanti durante la srccopia dei byte destfino 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 memcpyinformazioni della stessa dimensione in strcpygrado di derivare semplicemente scansionando in avanti fino a trovare un carattere che termina con null .
(che sottolinea anche cosa non strcpyfunziona (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.