Kuo skiriasi simbolių masyvas nuo c eilutės?


Atsakymas 1:

„Char“ masyvas yra gretimos atminties dalis, išanalizuota kaip 8 bitų baitai. Kuriant ji yra fiksuoto dydžio ir garantuoja, kad „char“ bus saugoma kiekviename baite.

„Char“ šiuo atveju yra bet koks 8 bitų dvejetainis skaitmuo nuo00000000 (0x00 šešiakampis) iki 11111111 (0xFF šešiakampis).

char masyvas [100]; / * 100 ženklų masyvo [0] iki masyvo [99] * /

C eilutė saugojimui naudoja char masyvą. C eilutė gali būti nuo 0 iki masyvo ilgio atėmus 1 ženklą.

Kad masyvas būtų tinkamai suformuotas, jame gali būti tik baitų pogrupis, nurodantis galiojančius simbolius naudotinų simbolių rinkinyje. Dažnai tai yra ASCII arba UTF-8. Bet kuris kitas baitas gali būti negaliojantis spausdinant ar aiškinant eilutę.

Eilutė turės etiketę (kintamąjį), kuri yra simbolių rodyklės (char *) rūšis, kurioje yra masyvo adresas.

Eilutė turės NULCHAR ('\ 0', 0x00 hex), užbaigiantį eilutę po paskutinio eilutės simbolio.

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

„Neatidėliotina eilutė“ yra rašoma dvigubomis kabutėmis šaltinio kode ir sukuria ženklų masyvą su užpildytais ženklais ir įdeda į specialią tik skaitomos eilutės atminties vietą, o rodyklė į ją grąžinama. Tai yra kompiliatoriaus „sintaksinis cukrus“ ir leidžia lengvai naudoti tokias stygas. NULCHAR automatiškai pridedamas prie masyvo, kad jis būtų gerai suformuotas.

char * s = "tiesioginė eilutė"; printf („% s \ n), s);

Visos standartinės C bibliotekos eilutės funkcijos pereina stygas kaip char * s ir priklauso nuo to, ar yra „\ 0“.

„Nulaužimas“, kuris yra naudojamas gana universaliai, yra tas, kad masyvo etiketė, kai prieinama, yra dvigubai reikšminga kaip pirmasis masyvo elementas. ir atvirkščiai.

char * x = "abcdefgh"; printf („x 4 simbolis:% c \ n“, x [3]); x 4 char: d / * įdėkite eilutę į char masyvą * / 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

Nepaisant šio lankstumo, ženklų masyvas ir C eilutė nėra tiesiogiai suderinami.

char s [10]; s = "abcdefghi"; / * klaida * / // klaida: nesuderinami tipai, kai priskiriama „char [10]“ tipui iš „char *“ tipo. „abcdefghi“ yra betarpiška eilutė, kuri jai parodytame masyve pasirenkama į „a“. Priskirti s tai neveikia, nes char masyvai nepriskiriami.

Masyvai iš tikrųjų nėra C klasės pirmosios klasės tipai. Jų negalima tiesiogiai nukopijuoti, jie neturi jokių masyvo lygio operacijų ir pan. Viskas, kas daroma su C masyvais, daroma pagal individualų turinį, o ne kaip vienetą.

char s [10]; char * x = "abcdefghi"; / * '\ 0' yra pabaigoje * / strncpy (s, x, 10); / * kiekvieną kopiją kopijuoja į masyvą * /

Atsakymas 2:

Ženklų masyvas yra duomenų programa C programavimo kalba: atmintyje esančių baitų skaičius, kuriame galite saugoti ženklus. Kiekvienoje iš šių langelių galite išsaugoti bet kurį ženklą (ty 8 bitų baitus, vertės nuo 0 iki 255).

C stiliaus eilutė (kaip tai reiškia, ką aš suprantu „c-string“ jūsų klausime) yra būdas pavaizduoti simbolių „eilutę“, kurią C kalba apibūdina kaip simbolių skaičių be nulinio baito (reikšmė) 0). Tai parodo patys simboliai, po kurių eina nulinis baitas, taigi nereikia atskirai saugoti eilutės ilgio. Kontrastinkite tai su Paskalio stiliaus eilute, kur ją žymi 16 bitų nepasirašytas sveikasis skaičius, po kurio eina tas skaičius baitų informacijos (kad Paskalio eilutės ilgis būtų ne daugiau kaip 65535).

Taigi simbolių masyvas yra duomenų struktūra, o C stiliaus eilutė - duomenų vaizdavimas. Jie yra skirtingi žvėrys.

Simbolių masyvas gali turėti C stiliaus eilutę arba gali turėti dar ką nors (pvz., Jame yra naudingos informacijos po nulinio ženklo arba nėra jokio nulinio simbolio); ir net tokiu atveju jūs vis tiek galėsite ją suprasti kaip C stiliaus eilutę (jei joje yra bent vienas nulinis simbolis). C stiliaus eilutė gali būti saugoma simbolių masyve arba gali būti saugoma kur nors kitur, o ne masyve (pvz., Tik skaitoma atminties dalis, todėl negali „laikyti“ kitų reikšmių).