Nul-termineret streng

En nulltermineret streng eller C-streng (fra navnet på C-sproget ) eller ASCIIZ-streng er en måde at repræsentere strenge på i programmeringssprog, hvor en række tegn bruges i stedet for at introducere en speciel strengtype, og første specielle nul-tegn (NUL fra ASCII , med værdi 0).

Beskrivelse

For eksempel, i en strengbuffer (hukommelsesområde tildelt til lagring af en streng) med en størrelse på 11 bytes, kan en null-termineret streng "STRING" i Windows-1251- kodning repræsenteres som følger:

FRA T R O Til MEN NUL F % NUL fire
0xD1 0xD2 0xD0 0xCE 0xCA 0xC0 0x00 0x46 0x25 0x00 0x34

I dette eksempel er et hukommelsesområde på 11 bytes repræsenteret, selvom linjen i virkeligheden kun optager 7. Tegnene efter nul-tegnet (8 - 11 bytes) kaldes skrald - dette er data, der kan være blevet i bufferen fra tidligere linjer eller fra anden brug af hukommelse. De kan også indeholde nul-tegn.

Når du bruger enkeltbyte- kodninger ( ASCII ), er mængden af ​​hukommelse, der kræves for at repræsentere en streng med N tegn, N + 1 bytes. Når Unicode bruges til at kode tegn , afhænger længden af ​​strengen af ​​den anvendte Unicode-repræsentation (f.eks. 2N + 2 bytes til UCS-2 ).

Sådanne strenge er standard i C og nogle andre programmeringssprog. Fordi de bruges til at sende strengargumenter til standardfunktioner i mange operativsystemer, er operationer til håndtering af null-terminerede strenge dukket op på Pascal og andre sprog.

For at henvise til en null-termineret streng, bruges en pointer til dens første tegn. Dette er en enkel, hurtig og fleksibel tilgang, men fejltilbøjelig [1] [2] . Programmøren skal konstant overvåge sin kode, nemlig:

Nogle strengoperationer, såsom sammenkædning , er også langsommere for null-terminerede strenge end for andre strengtyper.

Sammenligning med alternativer

Et alternativ til null-terminerede strenge er de metoder, der anvendes i Pascal og moderne OOP-sprog. I Pascal starter strengen ved det første element i arrayet, og længden af ​​strengen er gemt i null-elementet. I dette tilfælde kræves der ingen speciel terminator for at markere slutningen af ​​linjen. På den anden side er strenglængden her begrænset af kapaciteten af ​​nul-elementet i arrayet, det vil sige, at i tilfælde af enkeltbyte-elementer må længden af ​​strengen ikke overstige 255 tegn. Nullterminerede strenge er ikke underlagt denne begrænsning og kan teoretisk opbevare strenge af enhver længde. Objektorienterede sprog gemmer en post med længden af ​​en streng og en reference (eller pointer) til en række tegn. Disse metoder lider ikke af ulempen ved null-terminerede strenge: de kan gemme nul-tegn uden forvrængning og speciel kodning.

En række grænseflader bruger dobbelt-nul-terminerede strenge, hvis termineringstegnet er to på hinanden følgende nul-terminatorer [3] .

På C-sprog

For at arbejde med nulterminerede strenge bruger programmeringssproget C en række funktioner :

I assemblersprog

Nogle varianter af assemblersprog bruger et særligt direktiv til at definere NUL-terminerede strenge. Så i GNU Assembler er der et direktiv .asciz[4] [5] for dette .

Se også

Noter

  1. Joel om software - Back to Basics (link ikke tilgængeligt) . Hentet 17. september 2016. Arkiveret fra originalen 25. september 2016. 
  2. Den dyreste en-byte fejl - ACM-kø . Hentet 17. september 2016. Arkiveret fra originalen 19. september 2016.
  3. Hvad er formatet af en dobbelt-nul-termineret streng uden strenge? Arkiveret 13. februar 2019 på Wayback Machine / MSDN, 2009
  4. Brug af GNU assembler som.: Assembly direktiver . Hentet 17. september 2016. Arkiveret fra originalen 17. september 2016.
  5. Arkiveret kopi . Hentet 17. september 2016. Arkiveret fra originalen 17. september 2016.

Litteratur

Links