Qual è la differenza tra una matrice di caratteri e una stringa C?
Risposta 1:
Un array di caratteri è un intervallo di memoria contiguo che viene analizzato come byte a 8 bit. Ha dimensioni fisse al momento della creazione e garantisce l'archiviazione di un carattere in ogni byte.
Un carattere in questo caso è qualsiasi cifra binaria a 8 bit da 00000000 (0x00 esadecimale) a 11111111 (0xFF esadecimale).
array di caratteri [100]; / * 100 caratteri array [0] a array [99] * /
Una stringa C utilizza un array di caratteri per l'archiviazione. Una stringa C può avere una lunghezza compresa tra 0 e la lunghezza dell'array meno 1 carattere.
Per essere ben formato, l'array può contenere solo un sottoinsieme di byte che rappresentano simboli validi nel set di caratteri da utilizzare. Spesso si tratta di ASCII o UTF-8. Eventuali altri byte potrebbero non essere validi durante la stampa o l'interpretazione della stringa.
La stringa avrà un'etichetta (variabile) che è un tipo di puntatore carattere (char *) che contiene l'indirizzo dell'array.
La stringa avrà un NULCHAR, ('\ 0', 0x00 hex) che termina la stringa, dopo l'ultimo carattere della stringa.
char s [10]; char * t = & s; strncpy (t, "012345678 \ 0", 10)
Una 'stringa immediata' è scritta tra virgolette doppie nel codice sorgente e provoca la creazione e l'inserimento di un array di caratteri con i caratteri compilati in una posizione di memoria di sola lettura della stringa speciale e viene restituito un puntatore ad esso. Questo è "zucchero di sintassi" del compilatore e semplifica l'utilizzo di tali stringhe. Un NULCHAR viene automaticamente aggiunto all'array per renderlo una stringa ben formata.
char * s = "una stringa immediata"; printf ("% s \ n), s);
Tutte le funzioni di stringa della libreria C standard passano le stringhe come char * s e si basano sulla presenza di '\ 0'.
Un "hack" che viene usato in modo abbastanza universale è che l'etichetta di un array quando si accede funge da puntatore al primo elemento dell'array. e viceversa.
char * x = "abcdefgh"; printf ("x 4 ° carattere:% c \ n", x [3]); x 4th char: d / * inserisce una stringa in un array di caratteri * / char str [100]; strncpy (str, "abcdefghijklmnop \ 0", 18); char * a = str; char * b = str + 7; printf ("% s \ n", a); abcdefghijklmnop printf ("% s \ n", b); hijklmnop
Nonostante questa flessibilità, un array di caratteri e una stringa C non sono direttamente compatibili.
char s [10]; s = "abcdefghi"; / * errore * / // errore: tipi incompatibili durante l'assegnazione al tipo 'char [10]' dal tipo 'char *' "abcdefghi" è una stringa immediata e si risolve in un puntatore a "a" nell'array creato per esso. L'assegnazione di s ad esso non funziona, poiché i array di caratteri non sono assegnabili.
Le matrici non sono in realtà un tipo di prima classe in C. Non possono essere copiate direttamente, non hanno operazioni a livello di matrice, ecc. Tutto ciò che viene fatto con le matrici in C viene fatto sui singoli contenuti, non come un'unità.
char s [10]; char * x = "abcdefghi"; / * '\ 0' è alla fine * / strncpy (s, x, 10); / * copia ogni carattere nell'array * /
Risposta 2:
Una matrice di caratteri è una struttura di dati nel linguaggio di programmazione C: un numero di byte in memoria in cui è possibile memorizzare caratteri. È possibile memorizzare qualsiasi carattere (ovvero byte di 8 bit, valore da 0 a 255) in ciascuna di queste celle.
Una stringa in stile C (come intendo per interpretare "stringa C" nella tua domanda) è un modo per rappresentare una "stringa" di caratteri, definita dal linguaggio C come un numero di caratteri senza byte null (valore 0). Questo è rappresentato dagli stessi caratteri seguiti da un byte nullo, quindi non è necessario memorizzare separatamente la lunghezza della stringa. Contrastalo con la stringa in stile Pascal, dove è rappresentata da un numero intero senza segno a 16 bit seguito da quel numero di byte di informazioni (in modo che la lunghezza della stringa di Pascal sia al massimo 65535).
Quindi l'array di caratteri è una struttura di dati, la stringa in stile C è la rappresentazione dei dati. Sono bestie diverse.
Una matrice di caratteri può contenere una stringa in stile C o può contenere qualcos'altro (ad esempio, contiene informazioni utili dopo il carattere null o non contiene alcun carattere null); e anche così potresti essere in grado di interpretarlo come una stringa in stile C (purché contenga almeno un carattere null). Una stringa in stile C può essere memorizzata in un array di caratteri, oppure può essere memorizzata in qualche luogo e non in un array (ad esempio, una parte di sola lettura della memoria e quindi non può "memorizzare" altri valori).