segunda-feira, 15 de maio de 2023

Cadeias de caracteres

Dados de caractere ou texto — letras do alfabeto e outros — são muito importantes no uso do computador. De fato, nossos computadores são mais para trabalharem com dados de texto do que com dados numéricos, o que é irônico, pois os computadores são sobretudo calculadoras sofisticadas. Mas aprendemos como fazer com que essas calculadoras sofisticadas façam muito trabalho útil para nós, manipulando o texto escrito, como as próprias palavras que você está lendo (que, naturalmente, foram manuseadas por um computador desde o momento em que foram escritas). É importante entender alguns dos fundamentos de como os computadores manuseiam os dados de texto.

Teclado
Imagem ilustrativa: Um teclado alfanumérico.

Os dados de texto são compostos de caracteres individuais, como a letra A. Cada letra é representada é  representada por um padrão particular de bits e ocupa um byte de armazenamento. Existe um esquema de codificação comum a quase todos os computadores, que é usado para definir o modo-padrão de determinar que conjuntos de bits representa que letra.

Por si mesmos, os caracteres não têm muito uso, até que os juntemos para formarem palavras e sentenças. Semelhantemente, dentro do nosso computador, os grupos de bytes de caractere são mais significativos do que bytes individuais por si mesmos. Existe um termo técnico em computação que é usado para descrever um conjunto de caracteres manipulados como uma única entidade, e esse termo é cadeia ou string. Uma cadeia é um grupo de bytes, um após o outro, tratado como uma unidade combinada.

Todas as linguagens de programação do nosso computador, e muitos dos tipos mais importantes de software — como programas de planilha — trabalham com cadeias de dados de caracteres. Os programas de processamento de texto são projetados principalmente para trabalharem com cadeias de caracteres. As cadeias são uma parte muito importante dos dados de computador que precisamos entender.

Embora as cadeias sejam importantes, não há muito a dizer sobre elas. Mas existe alguns detalhes-chave que você precisa saber, particularmente sobre como elas são armazenadas e as limitações que quase sempre são impostas, sobre que tipo de dados podemos usar.

Dentro da memória do computador e nos discos do computador, as cadeias são armazenadas conforme o senso-comum ditaria: os bytes de caractere são gravados um à direita do outro. Isso não é nada de especial. Entretanto, o que há de especial sobre as cadeias é que algo deverá ligá-las. Quando falamos de dados numéricos, cada tipo de dado tinha seu próprio formato específico rigidamente definido em termos do tamanho dos dados, isto é, quantos bytes ele ocupava. As cadeias, no entanto, são especiais porque não têm qualquer tamanho fixo — algumas são longas, algumas são curtas. E algo precisa definir esse tamanho, unindo os caracteres que compõem uma cadeia.

Porém, não existe um único modo universal de se fazer isso. Diferentes programas usam seus próprios métodos e regras para definirem qual é a cadeia e o que as mantém juntas. Assim, embora não possamos estabelecer quaisquer regras, podemos ver alguns dos métodos mais comuns, e isso nos dará alguma ideia de como nossos programas trabalham com cadeias e como ocorrem as limitações sobre as cadeias.

Há duas formas principais usadas pelos programas para definirem o tamanho de uma cadeia, onde ela termina. Uma é simplesmente manter o tamanho da cadeia como um número registrado separadamente dela (em geral, este número de tamanho-de-cadeia é colocado logo antes do ínicio da própria cadeia). Eis um exemplo hipotético:

4Esta4pode3ser3uma6cadeia2de8palavras

Como você pode ver, cada palavra no exemplo é uma cadeia separada, e o número de bytes de caractere em cada palavra é registrado logo antes dela. Esta é uma técnica muito comum para lidar com cadeias e determinar o tamanho que elas ocupam. Se você pensar bem, notará que este método coloca um limite inerente no tamanho de qualquer cadeia individual. O número que representa o tamanho da cadeia é registrado em algum formato numérico. O número máximo que esse formato permite define um limite para o tamanho da cadeia.

É muito comum termos o tamanho de uma cadeia registrado em um único byte não-sinalizado — que não pode ser maior do que 255. Assim, muitos programas que trabalham com cadeias possuem um limite de 255 como a maior cadeia possível com que podem trabalhar. (As vezes o limite é um pouco menos de 255, pois um ou dois bytes podem ser necessários para algum requisito adicional.) Alguns programas de processamento de texto mantêm cada linha como uma cadeia separada, e usam um contador de tamanho de cadeia de 1 byte; estes possuem uma limitação de que cada linha não poderá ter mais de 255 caracteres.

Há um outro modo de determinar o tamanho de uma cadeia, que não coloca qualquer limite arbitrário sobre o tamanho que uma cadeia pode ter. Com esta técnica, o tamanho da cadeia não é registrado, mas, ao invés disso, o final da cadeia é marcado com algum tipo de delimitador. Eis um outro exemplo hipotético, usando asteriscos como delimitadores:

Esta*pode*ser*uma*cadeia*de*palavras

O delimitador é usado para marcar o fim da cadeia, mas não é considerado parte da própria cadeia. Há dois delimitadores que são muito usados: um é um byte 0, um byte com todos os bits desligados. O outro delimitador comumente usado é um byte com um código numérico 13. Treze é o código para o caractere de retorno de carro, que, em geral, é usado para marcar o final de uma linha de texto. Como é comum tratar cada linha de texto como uma cadeia separada, faz sentido usar o mesmo código de byte para significar tanto fim-de-linha quanto fim-de-cadeia.

Existe uma desvantagem óbvia para o uso de um código delimitador espacial para o fim-de-cadeia — ele significa que a cadeia não poderá usar esse código dentro de si. Esse pode não ser um grande problema na maioria das circunstâncias, mas ainda é uma desvantagem e uma limitação, de modo que precisamos estar cientes dele.

Nenhum comentário:

Postar um comentário