Wat is het verschil tussen een character array en een c-string?


Antwoord 1:

Een reeks tekens is een aaneengesloten geheugenbereik dat wordt geparseerd als 8-bits bytes. Het heeft een vaste grootte bij het maken en garandeert gegarandeerd een teken in elke byte.

Een teken is in dit geval elk 8-bits binair cijfer van 00000000 (0x00 hex) tot 11111111 (0xFF hex).

char array [100]; / * 100 tekens array [0] tot array [99] * /

Een C-string gebruikt een char array voor opslag. Een C-string kan van 0 tot de lengte van de array minus 1 tekens lang zijn.

Om goed gevormd te zijn, mag de array alleen een subset van bytes bevatten die geldige symbolen vertegenwoordigen in de te gebruiken tekenset. Vaak is dit ASCII of UTF-8. Andere bytes zijn mogelijk niet geldig bij het afdrukken of interpreteren van de tekenreeks.

De tekenreeks heeft een label (variabele) van het type karakterpointer (char *) dat het adres van de array bevat.

De tekenreeks heeft een NULCHAR ('\ 0', 0x00 hex) die de tekenreeks eindigt na het laatste teken van de tekenreeks.

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

Een 'onmiddellijke string' wordt in dubbele code tussen dubbele aanhalingstekens geschreven en zorgt ervoor dat een char-array met de ingevulde tekens wordt gemaakt en op een speciale alleen-lezen geheugenlocatie wordt geplaatst en dat er een pointer naar wordt teruggestuurd. Dit is "syntaxisuiker" door de compiler en maakt het eenvoudig om dergelijke strings te gebruiken. Een NULCHAR wordt automatisch aan de array toegevoegd om er een goed gevormde string van te maken.

char * s = "een onmiddellijke string"; printf ("% s \ n), s);

Alle standaard C-bibliotheek stringfuncties geven strings door als char * s en vertrouwen erop dat de '\ 0' aanwezig is.

Een 'hack' die redelijk universeel wordt gebruikt, is dat het label van een array bij toegang ook fungeert als een wijzer naar het eerste element van de array. en vice versa.

char * x = "abcdefgh"; printf ("x 4e teken:% c \ n", x [3]); x 4e teken: d / * plaats een string in een tekenreeks * / 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

Ondanks deze flexibiliteit zijn een char array en een C-string niet direct compatibel.

char s [10]; s = "abcdefghi"; / * error * / // error: incompatibele typen bij toewijzing aan type 'char [10]' van type 'char *' "abcdefghi" is een onmiddellijke tekenreeks en wordt omgezet in een pointer naar 'a' in de array die ervoor is gemaakt. Het toewijzen van s werkt niet, omdat char-arrays niet kunnen worden toegewezen.

Arrays zijn niet echt een eerste klas type in C. Ze kunnen niet direct worden gekopieerd, ze hebben geen array-level bewerkingen, etc. Alles wat met arrays in C wordt gedaan, gebeurt op de individuele inhoud, niet als een eenheid.

char s [10]; char * x = "abcdefghi"; / * '\ 0' staat aan het einde * / strncpy (s, x, 10); / * kopieert elk teken naar array * /

Antwoord 2:

Een character array is een gegevensstructuur in de C-programmeertaal: een aantal bytes in het geheugen waarin u tekens kunt opslaan. U kunt elk teken opslaan (dwz bytes van 8 bits, waarde 0 tot 255) in elk van deze cellen.

Een string in C-stijl (zoals ik in uw vraag 'c-string' interpreteer) is een manier om een ​​'tekenreeks' van tekens weer te geven, gedefinieerd door de C-taal als een aantal tekens zonder de null-byte (waarde 0). Dit wordt weergegeven door die tekens zelf, gevolgd door een null-byte, zodat het niet nodig is om de lengte van de string afzonderlijk op te slaan. Vergelijk dit met de tekenreeks in Pascal-stijl, waar deze wordt voorgesteld door een 16-bits geheel getal zonder teken gevolgd door dat aantal bytes aan informatie (zodat de lengte van de tekenreeks van Pascal maximaal 65535 is).

Dus character array is een datastructuur, C-stijl string is datarepresentatie. Het zijn verschillende beesten.

Een character array kan een string in C-stijl bevatten, of het kan iets anders bevatten (het bevat bijvoorbeeld nuttige informatie na het nul-teken of bevat geen enkel nul-teken); en toch zou je het toch als een tekenreeks in C-stijl kunnen interpreteren (zolang het ten minste één nul-teken bevat). Een tekenreeks in C-stijl kan worden opgeslagen in een tekenreeks of ergens anders in een reeks worden opgeslagen (bijvoorbeeld een alleen-lezen deel van het geheugen en kan dus geen andere waarden "opslaan").