Noll-terminerad sträng

En nollterminerad sträng eller C-sträng (från namnet på C-språket ) eller ASCIIZ-sträng är ett sätt att representera strängar i programmeringsspråk, där en uppsättning tecken används istället för att introducera en speciell strängtyp, och första speciella nolltecken (NUL från ASCII , med värde 0).

Beskrivning

Till exempel, i en strängbuffert (minnesområde tilldelat för lagring av en sträng) med en storlek på 11 byte, kan en nollterminerad sträng "STRING" i Windows-1251- kodning representeras enligt följande:

FRÅN T R O Till MEN NUL F % NUL fyra
0xD1 0xD2 0xD0 0xCE 0xCA 0xC0 0x00 0x46 0x25 0x00 0x34

I det här exemplet representeras ett minnesområde på 11 byte, även om raden i verkligheten bara upptar 7. Tecknen efter nolltecknet (8 - 11 byte) kallas skräp - det här är data som kan ha stannat kvar i bufferten från tidigare rader eller från annan användning av minne. De kan också innehålla nolltecken.

När du använder enkelbyte- kodningar ( ASCII ) är mängden minne som krävs för att representera en sträng med N tecken N + 1 byte. När Unicode används för att koda tecken beror längden på strängen på vilken Unicode-representation som används (till exempel 2N + 2 byte för UCS-2 ).

Sådana strängar är standard i C och vissa andra programmeringsspråk. Eftersom de används för att skicka strängargument till standardfunktioner i många operativsystem har operationer för att hantera nollterminerade strängar dykt upp på Pascal och andra språk.

För att referera till en nollterminerad sträng används en pekare till dess första tecken. Detta är ett enkelt, snabbt och flexibelt tillvägagångssätt, men felbenäget [1] [2] . Programmeraren måste ständigt övervaka sin kod, nämligen:

Vissa strängoperationer, såsom sammanlänkning , är också långsammare för nollterminerade strängar än för andra strängtyper.

Jämförelse med alternativ

Ett alternativ till nollterminerade strängar är de metoder som används i Pascal och moderna OOP-språk. I Pascal börjar strängen vid det första elementet i arrayen, och längden på strängen lagras i null-elementet. I det här fallet krävs ingen speciell terminator för att markera slutet på raden. Å andra sidan, här begränsas stränglängden av kapaciteten hos nollelementet i arrayen, det vill säga, i fallet med enkelbyteelement, får strängen inte överstiga 255 tecken. Nollterminerade strängar är inte föremål för denna begränsning och kan teoretiskt lagra strängar av vilken längd som helst. Objektorienterade språk lagrar en post med längden på en sträng och en referens (eller pekare) till en rad tecken. Dessa metoder lider inte av nackdelen med nollterminerade strängar: de kan lagra nolltecken utan förvrängning och speciell kodning.

Ett antal gränssnitt använder dubbel-null-terminerade strängar, vars avslutningstecken är två på varandra följande noll-terminatorer [3] .

På C-språk

För att arbeta med nollterminerade strängar använder programmeringsspråket C ett antal funktioner :

På assemblerspråk

Vissa varianter av assemblerspråk använder ett speciellt direktiv för att definiera NUL-terminerade strängar. Så i GNU Assembler finns det ett direktiv .asciz[4] [5] för detta .

Se även

Anteckningar

  1. Joel om programvara - Tillbaka till grunderna (länk ej tillgänglig) . Hämtad 17 september 2016. Arkiverad från originalet 25 september 2016. 
  2. Det dyraste One-byte-misstaget - ACM-kö . Hämtad 17 september 2016. Arkiverad från originalet 19 september 2016.
  3. Vilket format har en dubbel-null-terminerad sträng utan strängar? Arkiverad 13 februari 2019 på Wayback Machine / MSDN, 2009
  4. Använda GNU assembler som.: Monteringsdirektiv . Hämtad 17 september 2016. Arkiverad från originalet 17 september 2016.
  5. Arkiverad kopia . Hämtad 17 september 2016. Arkiverad från originalet 17 september 2016.

Litteratur

Länkar