Strings e caracteres
Caracteres
O compilador trabalha com os caracteres constantes na code page Windows 1252 (ISO-8859-1).
A lista é composta de 256 caracteres, incluindo caracteres de controle.
␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏ ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟ ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ ? € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
Abaixo temos a implementação do tipo caractere:
Um caractere é um byte.
\ 1 byte = 8 bits
Um byte são 8 bits sequenciais de dados binários. São números sem sinal, com valores variando de 0 a 255.
Como os caracteres nada mais são do que um tipo derivado do tipo byte, é possível utilizar as mesmas operações aritméticas comuns (soma, subtração, etc).
Strings
Strings são delimitadas com aspas duplas.
Exemplo:
O servidor SMTP padrão é uma string igual a
"localhost"
.
Atribua
"José"
ao nome desta pessoa.
Se o nome desta pessoa for
"João"
, retorne.
Utilizamos aspas duplas como caractere de escape.
Exemplo:
Atribua
"Erro. A palavra chave ""
Itere
"" não foi localizada."
à mensagem de erro.
No código abaixo temos a implementação do tipo string:
Uma string é uma estrutura com
Um caractere inicial e
Um caractere final.
Sendo que
Um caractere inicial é um ponteiro [que aponta] para um byte.
Um caractere final é um ponteiro [que aponta] para um byte.
Perceba que o compilador armazena "strings" em duas partes:
Uma
estrutura
com um par de ponteiros de bytes denominadoscaractere inicial
ecaractere final
, eUm array dinâmico que contém os bytes reais da string, de forma similar à imagem abaixo:
Observação: os números no diagrama acima, são endereços fictícios.
Uma string é considerada em branco
se o caractere inicial for inexistente (ou seja, nenhuma memória foi alocada ainda) ou se o endereço do caractere final
for menor do que o endereço do caractere inicial
(o que permite ao compilador realizar pré-alocação de memória).
As strings são alocadas dinamicamente e podem ter qualquer comprimento - mas a memória de strings é gerenciada inteiramente (e de forma muito eficiente) pelo compilador, quase como se fossem alocadas estaticamente. Em outras palavras, você não precisa se preocupar com elas, pois o compilador gerencia a alocação e desalocação de forma automática.
Manipulando strings
Na Biblioteca padrão existem diversas rotinas para manipulação de strings.
Exemplos:
ATRIBUA variável PARA uma string.
ACRESCENTE algo PARA uma string.
INSIRA algo EM uma STRING antes de um caractere.
REMOVA O CARACTERE INICIAL DE uma string.
REMOVA O CARACTERE FINAL DE uma string.
PREENCHA uma string COM um CARACTERE USANDO uma quantidade.
REMOVA OS CARACTERES INICIAIS DE uma string USANDO uma quantidade.
REMOVA OS CARACTERES FINAIS DE uma string COM UMA quantidade.
REMOVE OS CARACTERES DE uma string DADA uma substring.
Você também pode alterar uma string para deixar o texto em LETRAS MAIÚSCULAS ou em letras minúsculas. (Ou alterar apenas a primeira letra para letras maiúsculas).
E você pode, é claro, obter o comprimento de uma string, em bytes.
Exemplo:
Atribua "João" para uma string.
Atribua o comprimento desta string para um número.
Além disso, você pode concatenar strings com strings — e outros tipos de dados — usando o operador junto com
ou seguido de
.
Exemplo:
Atribua o nome
junto com
o sobrenome para uma string.
Escreva "Erro #"
junto com
o número do erro
seguido de
"." no console.
Subtextos
Um "subtexto" faz parte de uma string. Os subtextos são implementadas como uma estrutura igual a uma string — um par de ponteiros de bytes chamados caractere inicial e caractere final — o que torna o subtexto compatível com o tipo string.
O comando:
Lance um subtexto em uma string.
Faz com que o caractere inicial
e o caractere final
do subtexto englobem toda a string.
Dessa forma você pode percorrer através dos caracteres da string, indo para frente ou para trás. Para iso basta incrementar o valor do endereço do caractere inicial ou reduzir o valor do endereço do caractere final do subtexto.
Você também pode usar o comando:
Posicione um subtexto em uma string.
O comando acima define apenas o caractere inicial do subtexto, deixando o valor do caractere final inicialmente em branco, porém pronto para ser alterado. Ao definir e incrementar o valor do caractere final, você pode ir criando a substring um byte de cada vez.
Os subtextos são utilizados principalmente de forma conjunta com "percorredores".
Trabalhando com Percorredores
Um "percorredor" é uma estrutura usada para analisar strings (fazer o parsing) . Para entendê-lo, você deve estar familiarizado com o conceito "strings" e "subtextos".
Parsing é o ato de percorrer um bloco de texto, um pedaço de cada vez, onde um pedaço pode ser tão pequeno quanto uma letra ou tão grande quanto o bloco inteiro.
Vamos usar a string abaixo como nosso bloco de texto de exemplo:
"The quick brown fox jumps over the lazy dog"
Digamos que queremos extrair cada uma das palavras individuais da string acima.
As ferramentas que usaremos serão
o subtexto, e
o percorredor
Um percorredor é definido da seguinte forma:
Quando você "lançar" um subtexto na string acima, o compilador irá definir o caractere inicial do subtexto como "T" (da palavra The) e o caractere inicial como "g" (da palavra dog).
Ao usar o comando:
"Lance um percorredor sobre o subtexto"
Os membros do percorredor ficarão assim:
cópia da string original = "The quick brown fox jumps over the lazy dog"
segmento inicial = ""
segmento final = "The quick brown fox jumps over the lazy dog"
A partir daí podemos invocar a rotina
Mova o percorredor (strings com aspas).
Neste momento, os membros do percorredor ficarão assim:
cópia da string original = "The quick brown fox jumps over the lazy dog"
segmento inicial = "The"
segmento final = "quick brown fox jumps over the lazy dog"
Se reperirmos o comando, os membros do percorredor ficarão assim:
cópia da string original = "The quick brown fox jumps over the lazy dog"
segmento inicial = "quick"
segmento final = "brown fox jumps over the lazy dog"
Perceba que o "The" foi "removido" do segmento inicial.
Outra rotina útil que serve para percorrer uma string caractere a caractere é:
Avance o percorredor.
Digamos que o nosso percorredor esteja assim:
cópia da string original = "The quick brown fox jumps over the lazy dog"
segmento inicial = ""
segmento final = "The quick brown fox jumps over the lazy dog"
Ao usar a rotina "avance um percorredor", nosso percorredor ficará assim:
cópia da string original = "The quick brown fox jumps over the lazy dog"
segmento inicial = "T"
segmento final = "he quick brown fox jumps over the lazy dog"
Importante:
Subtextos contém ponteiros para os caracteres então precisamos usar a seguinte sintaxe para obter o valor do dado em si:
O
conteúdo
deste
caractere inicial
deste
segmento inicial
deste
percorredor
.
É um tanto quanto prolixo, mas não há outra forma.
Atualizado