Kakšna je razlika med nizom znakov in nizom c?


Odgovor 1:

Niz char je neprekinjeno razpon pomnilnika, ki je razčlenjeno kot 8-bitni bajti. Ob ustvarjanju je določen v velikosti in zagotovo shrani znak v vsak bajt.

Znak v tem primeru je vsaka 8-bitna binarna številka od00000000 (0x00 hex) do 11111111 (0xFF hex).

matrika [100]; / * Matrika 100 znakov [0] do matrike [99] * /

Niz C uporablja za shranjevanje matriko char. Dolžina niza C je lahko od 0 do dolžine matrike minus 1 znakov.

Če je matica dobro oblikovana, lahko vsebuje samo podvrsto bajtov, ki predstavljajo veljavne simbole v uporabljenem naboru znakov. Pogosto je to ASCII ali UTF-8.Vsi drugi bajti morda niso veljavni pri tiskanju ali interpretaciji niza.

Niz bo imel oznako (spremenljivko), ki je tip kazalca (char *), ki vsebuje naslov matrike.

V nizu bo NULCHAR, ('\ 0', 0x00 hex), ki zaključuje niz, po zadnjem znaku niza.

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

Neposredni niz je v izvirni kodi zapisan z dvojnimi narekovaji in povzroči, da se ustvari matrična zaporedje z izpolnjenimi črkami in postavi na poseben niz pomnilnika, ki je samo za branje, in se vrne kazalec nanj. Prevajalnik je »sintaksa sladkor«, ki omogoča enostavno uporabo takšnih nizov. NULCHAR se samodejno doda v matriko, da postane dobro oblikovan niz.

char * s = "neposredni niz"; printf ("% s \ n), s);

Vse običajne funkcije knjižnic C knjižnice C prejemajo niza kot char * s in se opirajo na prisotnost '\ 0'.

Hak ", ki se uporablja dokaj univerzalno, je, da se oznaka matrice, ko je dostopna, podvoji kot kazalec na prvi element matrike. in obratno.

char * x = "abcdefgh"; printf ("x 4. znak:% c \ n", x [3]); x 4th char: d / * vstavite niz v matriko 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

Kljub tej prilagodljivosti niz matic in nizov C nista neposredno združljiva.

char s [10]; s = "abcdefghi"; / * napaka * / // napaka: nezdružljivi tipi pri dodeljevanju tipu 'char [10]' tipu 'char *' "abcdefghi" je takojšen niz in se razreši na kazalcu na 'a' v polju, ustvarjenem zanj. Če dodelite s, ne deluje, saj matriki ni mogoče določiti.

Matriki v resnici niso prvovrstni tipi v C. Ne morejo jih neposredno kopirati, nimajo operacij na ravni matrike itd. Vse, kar naredimo z matriki v C, je narejeno na posameznih vsebinah in ne kot enota.

char s [10]; char * x = "abcdefghi"; / * '\ 0' je na koncu * / strncpy (s, x, 10); / * kopira vsak znak v matriko * /

Odgovor 2:

Niz znakov je podatkovna struktura v programskem jeziku C: več bajtov v pomnilniku, v katere lahko shranite znake. V vsako od teh celic lahko shranite kateri koli znak (tj. Bajte 8-bitnih, vrednost 0 do 255).

Niz v slogu C (kot to v svojem vprašanju razlagam "c-string") je način, kako predstaviti "niz" znakov, ki ga jezik C definira kot število znakov brez ničelnega bajta (vrednost 0). To predstavljajo sami znaki, ki jim sledi ničelni bajt, tako da ni treba ločeno shraniti dolžine niza. To primerjajte z nizom v slogu Pascal, kjer ga predstavlja 16-bitno nepodpisano celo število, ki mu sledi to število bajtov informacij (tako da je dolžina Pascal niza največ 65535).

Torej je niz znakov podatkovna struktura, niz v slogu C je predstavitev podatkov. So različne zveri.

Niz znakov lahko vsebuje niz v slogu C ali lahko vsebuje nekaj drugega (npr. Vsebuje koristne informacije po ničelnem znaku ali ne vsebuje ničelnega znaka); in kljub temu si ga boste tako ali tako lahko razlagali kot niz v slogu C (če vsebuje vsaj en ničelni znak). Niz v slogu C je lahko shranjen v znakovnem nizu ali pa je shranjen nekje v polju, ki ni matrika (npr. Del pomnilnika, ki je samo za branje, zato ne more "shraniti" drugih vrednosti).