Quina diferència hi ha entre una matriu de caràcters i una cadena c?


Resposta 1:

Una matriu de caràcters és una extensió de memòria contigua que es analitza com a bytes de 8 bits. Es té una mida fixa en la creació i es garanteix que emmagatzemi un carnet a cada byte.

Un caràcter en aquest cas és qualsevol dígit binari de 8 bits des del00000000 (0x00 hex) fins al 11111111 (0xFF hex).

matriu de char [100]; / * 100 chars array [0] to array [99] * /

Una cadena C utilitza una matriu char per a emmagatzematge. Una cadena C pot ser de 0 a la longitud de la matriu menys 1 caràcters.

Per estar ben format, la matriu només pot contenir un subconjunt d'octets que representen símbols vàlids al conjunt de caràcters que s'utilitzarà. Sovint, això és ASCII o UTF-8.Alguns altres bytes poden no ser vàlids quan imprimiu o interpreteu la cadena.

La cadena tindrà una etiqueta (variable) que és un tipus de punter de caràcters (char *) que conté l’adreça de la matriu.

La cadena tindrà un NULCHAR, ('\ 0', 0x00 hex) que finalitzi la cadena, després del darrer caràcter de la cadena.

char s [10]; char * t = & s; strncpy (t, "012345678 \ 0", 10)

Una "cadena immediata" s'escriu entre cometes dobles en codi font i fa que es creï una matriu de caràcters amb els caràcters omplits i es posi en una ubicació especial de memòria de només lectura, i es retorni un punter. Es tracta del "sucre de sintaxi" del compilador i el fa senzill utilitzar aquestes cadenes. S’afegeix automàticament a la matriu un NULCHAR per convertir-lo en una cadena ben formada.

char * s = "una cadena immediata"; printf ("% s \ n), s);

Totes les funcions de cadena de biblioteca C estàndard passen cadenes com a caràcters * i depenen del fet que hi estigui present \ '0.

Un "hack" que s'utilitza força universalment és que l'etiqueta d'una matriu quan s'accedeix es dobla com a punter al primer element de la matriu. i viceversa.

char * x = "abcdefgh"; printf ("x 4 º char:% c \ n", x [3]); x 4t char: d / * introduir una cadena en una matriu de caràcters * / 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

Malgrat aquesta flexibilitat, una matriu de caràcters i una cadena C no són directament compatibles.

char s [10]; s = "abcdefghi"; / * error * / // error: els tipus incompatibles quan s'assigna al tipus 'char [10]' del tipus 'char *' "abcdefghi" és una cadena immediata i es resol a un punter per "a" en la matriu creada per a això. Assignar-la no funciona, ja que no es poden assignar les matrius de caràcters.

Les fitxes no són realment un tipus de primera classe en C. No es poden copiar directament, no tenen operacions a nivell de matriu, etc. Tot el que es fa amb les matrius en C es fa sobre els continguts individuals, no com a unitat.

char s [10]; char * x = "abcdefghi"; / * '\ 0' es troba al final * / strncpy (s, x, 10); / * copia cadascun dels caràcters a la matriu * /

Resposta 2:

Una matriu de caràcters és una estructura de dades del llenguatge de programació C: un nombre de bytes a la memòria en què podeu emmagatzemar caràcters. Podeu emmagatzemar qualsevol caràcter (és a dir, bytes de 8 bits, valor 0 a 255) a cadascuna d’aquestes cel·les.

Una cadena d'estil C (com el que interpreto "c-string" a la vostra pregunta) és una manera de representar una "cadena" de caràcters, definida pel llenguatge C per ser un nombre de caràcters sense el byte nul (valor 0). Això els representa els mateixos caràcters seguits d'un byte nul, de manera que no és necessari emmagatzemar per separat la longitud de la cadena. Contrasteu-ho amb la cadena d'estil Pascal, on es representa amb un nombre sencer de 16 bits seguit pel nombre d'octets d'informació (de manera que la longitud de la cadena Pascal és al màxim de 65535).

Així doncs, la matriu de caràcters és una estructura de dades, la cadena d'estil C és representació de dades. Són diferents bèsties.

Una matriu de caràcters pot contenir una cadena d'estil C o pot contenir una altra cosa (per exemple, conté informació útil després del caràcter nul o no conté cap tipus de caràcter nul); i tot i així, podríeu interpretar-la com una cadena d'estil C (sempre que contingui almenys un caràcter nul). Una cadena d'estil C es pot emmagatzemar en una matriu de caràcters o es pot emmagatzemar en un lloc que no sigui una matriu (per exemple, una part de només lectura de la memòria i, per tant, no pot "emmagatzemar" altres valors).