Vés al contingut

Cadenes en C

De la Viquipèdia, l'enciclopèdia lliure
Cadenes en C

Tipustipus de dada Modifica el valor a Wikidata
Característiques tècniques
PlataformaBiblioteca estàndard C

El llenguatge de programació C té un conjunt de funcions que implementen operacions sobre cadenes (cadenes de caràcters i cadenes de bytes) a la seva biblioteca estàndard. S'admeten diverses operacions, com ara la còpia, la concatenació, la tokenització i la cerca. Per a les cadenes de caràcters, la biblioteca estàndard utilitza la convenció que les cadenes estan terminades en nul·la: una cadena de n caràcters es representa com una matriu de n + 1 elements, l'últim dels quals és un "NULCaràcter " amb valor numèric 0.

L'únic suport per a les cadenes en el llenguatge de programació propi és que el compilador tradueix les constants de cadenes citades a cadenes amb terminació nul·la.

Definicions

[modifica]

Una cadena es defineix com una seqüència contigua d'unitats de codi acabades per la primera unitat de codi zero (sovint anomenada unitat de codi NUL ).[1] Això significa que una cadena no pot contenir la unitat de codi zero, ja que la primera que es veu marca el final de la cadena. La longitud d'una cadena és el nombre d'unitats de codi abans de la unitat de codi zero.[1] La memòria ocupada per una cadena és sempre una unitat de codi més que la longitud, ja que es necessita espai per emmagatzemar el terminador zero.

En general, el terme cadena significa una cadena on la unitat de codi és del tipus char, que és exactament 8 bits a totes les màquines modernes. C90 defineix cadenes amples [1] que utilitzen una unitat de codi de tipus wchar_t, que és de 16 o 32 bits a les màquines modernes. Això estava pensat per a Unicode, però cada cop és més comú utilitzar UTF-8 en cadenes normals per a Unicode.

Les cadenes es passen a les funcions passant un punter a la primera unitat de codi. Com que char* i wchar_t* són tipus diferents, les funcions que processen cadenes amples són diferents de les que processen cadenes normals i tenen noms diferents.

Els literals de cadena ("text" al codi font C) es converteixen en matrius durant la compilació.[1] El resultat és una matriu d'unitats de codi que conté tots els caràcters més una unitat de codi zero final. A C90 L"text" produeix una cadena ampla. Un literal de cadena pot contenir la unitat de codi zero (una manera és posar \0 a la font), però això farà que la cadena acabi en aquest punt. La resta del literal es col·locarà a la memòria (amb una altra unitat de codi zero afegit al final), però és impossible saber que aquestes unitats de codi es van traduir del literal de cadena, per tant, aquest codi font no és un literal de cadena.[1]

Codificacions de caràcters

[modifica]

Cada cadena acaba en la primera ocurrència de la unitat de codi zero del tipus adequat (char o wchar_t). En conseqüència, una cadena de bytes (char* ) pot contenir caràcters no NUL en ASCII o qualsevol extensió ASCII, però no caràcters en codificacions com UTF-16 (tot i que una unitat de codi de 16 bits pot ser diferent de zero, el seu byte alt o baix). pot ser zero). Les codificacions que es poden emmagatzemar en cadenes amples es defineixen per l'amplada de wchar_t. En la majoria de les implementacions, wchar_t és com a mínim de 16 bits i, per tant, es poden emmagatzemar totes les codificacions de 16 bits, com ara UCS-2. Si wchar_t és de 32 bits, es poden emmagatzemar codificacions de 32 bits, com ara UTF-32. (L'estàndard requereix un "tipus que conté qualsevol caràcter ample", que a Windows ja no és cert des del canvi UCS-2 a UTF-16. Això es va reconèixer com un defecte en l'estàndard i es va solucionar en C++.) [2] C++11 i C11 afegeixen dos tipus amb amplades explícites char16_t i char32_t.[3]

Referències

[modifica]
  1. 1,0 1,1 1,2 1,3 1,4 «The C99 standard draft + TC3» (en anglès). [Consulta: 7 gener 2011].
  2. «Relax requirements on wchar_t to match existing practices» (en anglès).
  3. «Fundamental types» (en anglès). en.cppreference.com.