Hva er forskjellen mellom en karaktergruppe og en c-streng?


Svar 1:

En rekke røye er et sammenhengende minnespenn som blir analysert som 8 bit byte.Det er fast i størrelse ved opprettelse, og garantert vil lagre en røyke i hver byte.

I dette tilfellet er et hvilket som helst 8-bit binært siffer fra00000000 (0x00 hex) til 11111111 (0xFF hex).

røye array [100]; / * 100 tegn array [0] til array [99] * /

En C-streng bruker en char array for lagring. En C-streng kan være fra 0 til lengden på matrisen minus 1 tegn lang.

For å være godt utformet, kan matrisen bare inneholde et underett med byte som representerer gyldige symboler i tegnsettet som skal brukes. Ofte er dette ASCII eller UTF-8.Alle andre byte er kanskje ikke gyldige når du skriver ut eller tolker strengen.

Strengen vil ha en etikett (variabel) som er en tegnpeker (char *) -type som inneholder adressen til matrisen.

Strengen vil ha en NULCHAR, ('\ 0', 0x00 hex) som avslutter strengen, etter den siste tegnet i strengen.

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

En 'øyeblikkelig streng' er skrevet med doble anførselstegn i kildekoden og fører til at et char array med de utfylte tegnene blir opprettet og plassert i en spesiell streng read-only memory location, og en peker til den returneres. Dette er "syntaks sukker" av kompilatoren og gjør det enkelt å bruke slike strenger. En NULCHAR blir automatisk lagt til i matrisen for å gjøre den til en velformet streng.

char * s = "en umiddelbar streng"; printf ("% s \ n), s);

Alle standard C-biblioteksstrengfunksjonene sender strenger som tegn *, og er avhengige av at '\ 0' er til stede.

Et "hack" som brukes ganske universelt, er at etiketten til en matrise når du tilgang til den fungerer som en peker til det første elementet i matrisen. og vice versa.

char * x = "abcdefgh"; printf ("x fjerde karakter:% c \ n", x [3]); x fjerde røyte: d / * legg en streng i en røyke-gruppe * / røystreng [100]; strncpy (str, "abcdefghijklmnop \ 0", 18); røye * a = str; røye * b = str + 7; printf ("% s \ n", a); abcdefghijklmnop printf ("% s \ n", b); hijklmnop

Til tross for denne fleksibiliteten, er en røyeoppstilling og en C-streng ikke direkte kompatible.

røye [10]; s = "abcdefghi"; / * error * / // error: inkompatible typer når du tilordner å skrive 'char [10]' fra type 'char *' "abcdefghi" er en øyeblikkelig streng og løser seg til en peker til 'a' i rekken opprettet for den. Tildeling av s til det fungerer ikke, da røysearrangementer ikke kan tilordnes.

Arrays er egentlig ikke en førsteklasses type i C. De kan ikke kopieres direkte, de har ingen operasjoner på array-nivå, etc. Alt som gjøres med matriser i C gjøres på det individuelle innholdet, ikke som en enhet.

røye [10]; char * x = "abcdefghi"; / * '\ 0' er på slutten * / strncpy (s, x, 10); / * kopierer hver røye til matrise * /

Svar 2:

Et tegnsett er en datastruktur i programmeringsspråket C: et antall byte i minnet der du kan lagre tegn. Du kan lagre alle tegn (dvs. byte på 8-bits, verdi 0 til 255) i hver av disse cellene.

En C-stil streng (som det jeg tolker “c-streng” i spørsmålet ditt til å bety) er en måte å representere en “streng” med tegn, definert av C-språket til å være et antall tegn uten nullbyte (verdi 0). Dette er representert av tegnene selv etterfulgt av en nullbyte, slik at det ikke er behov for å lagre lengden på strengen separat. Kontrast dette med Pascal-stilstrengen, der den er representert med et 16-bits usignert heltall fulgt av det antall byte med informasjon (slik at lengden på Pascal-strengen er på det høyeste 65535).

Så karakter array er en datastruktur, C-stil streng er datarepresentasjon. De er forskjellige dyr.

En karaktergruppe kan inneholde en streng i C-stil, eller den kan inneholde noe annet (f.eks. Den inneholder nyttig informasjon etter null-tegnet, eller inneholder ingen nulltegn overhodet); og likevel kan du kanskje tolke den som en C-stil streng uansett (så lenge den inneholder minst ett nulltegn). En C-stil streng kan lagres i en tegnserie, eller den kan lagres i et sted ikke i en matrise (f.eks. En skrivebeskyttet del av minnet og kan dermed ikke "lagre" andre verdier).