Care este diferența dintre un tablou de caractere și un șir de caractere?


Răspunsul 1:

O serie de caractere este un interval de memorie contigu care este analizat sub formă de octeți de 8 biți. Este fix ca dimensiune la creare și este garantat să stocheze un caracter în fiecare octet.

În acest caz, o caracteristică este orice cifră binară pe 8 biți de la 00000000 (0x00 hex) la 11111111 (0xFF hex).

matricea char [100]; / * 100 de caractere array [0] la matrice [99] * /

Un șir C folosește un șir de caractere pentru stocare. Un șir C poate fi de la 0 la lungimea tabloului cu mai puțin de 1 caractere.

Pentru a fi bine format, tabloul poate conține doar un subset de octeți care reprezintă simboluri valide în setul de caractere care va fi utilizat. Adesea acesta este ASCII sau UTF-8. Orice alți octeți pot să nu fie valabili atunci când imprimați sau interpretați șirul.

Șirul va avea o etichetă (variabilă) care este un tip pointer (char *) care conține adresa tabloului.

Șirul va avea un NULCHAR, ('\ 0', 0x00 hex) care încheie șirul, după ultimul caracter al șirului.

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

Un „șir imediat” este scris cu ghilimele duble în codul sursă și determină crearea unui șir de caractere cu caracterele completate și plasate într-o locație specială de memorie de citire numai a șirului, iar un indicator către acesta este returnat. Acesta este „zahărul de sintaxă” al compilatorului și simplifică utilizarea unor astfel de șiruri. Un NULCHAR este automat adăugat la tablou pentru a face un șir bine format.

char * s = "un șir imediat"; printf ("% s \ n), s);

Toate funcțiile de șir de bibliotecă standard C trec șiruri sub formă de caractere * și se bazează pe „\ 0” fiind prezent.

Un „hack” care este utilizat destul de universal este faptul că eticheta unui tablou când este accesat se dublează ca indicator pentru primul element al tabloului. si invers.

char * x = "abcdefgh"; printf ("x 4 char:% c \ n", x [3]); x al 4-lea char: d / * puneți un șir într-un tablou char * / 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

În ciuda acestei flexibilități, un tablou de caractere și un șir C nu sunt direct compatibile.

char s [10]; s = "abcdefghi"; / * eroare * / // eroare: tipuri incompatibile când se atribuie tipului „char [10]” de la tipul „char *” „abcdefghi” este un șir imediat și se rezolvă la un pointer pentru a „a” în tabloul creat pentru acesta. Alocarea lui nu funcționează, întrucât tablourile de caractere nu sunt atribuibile.

Matricele nu sunt de fapt un tip de primă clasă în C. Nu pot fi copiate direct, nu au operații la nivel de tablă, etc. Totul se face cu tablele în C se face pe conținutul individual, nu ca unitate.

char s [10]; char * x = "abcdefghi"; / * '\ 0' este la sfârșit * / strncpy (s, x, 10); / * copiază fiecare caracteristică în tablou

Răspunsul 2:

Un tablou de caractere este o structură de date în limbajul de programare C: un număr de octeți în memorie în care puteți stoca caractere. Puteți stoca orice caracter (adică, octeți de 8 biți, valoarea 0 la 255) în fiecare dintre aceste celule.

Un șir în stil C (așa cum interpretează „c-string” în întrebarea dvs.) este o modalitate de a reprezenta un „șir” de caractere, definit de limbajul C ca fiind un număr de caractere fără octetul nul (valoare 0). Aceasta este reprezentată de acele caractere însuși urmate de un octet nul, astfel încât nu este necesar să stocați separat lungimea șirului. Contrastați acest lucru cu șirul în stil Pascal, unde este reprezentat de un număr întreg nesemnat pe 16 biți urmat de acel număr de octeți de informații (astfel încât lungimea șirului Pascal este cel mult 65535).

Așadar, tabloul de caractere este o structură de date, șirul în stil C este reprezentarea datelor. Sunt fiare diferite.

Un tablou de caractere poate reține un șir în stil C sau poate conține altceva (de exemplu, conține informații utile după caracterul nul sau nu conține niciun caracter nul); și chiar așa, s-ar putea să-l poți interpreta oricum ca un șir în stil C (atât timp cât conține cel puțin un caracter nul). Un șir în stil C poate fi stocat într-un tablou de caractere sau poate fi stocat în altă parte nu într-un tablou (de exemplu, o parte doar citită a memoriei și, prin urmare, nu poate „stoca” alte valori).