Cadeia de Caracteres - Introdução

Este post faz parte da série Cadeia de Caracteres. Leia também os outros posts da série:

Neste artigo introduziremos o conceito de Cadeia de Caracteres. Para que vocês consigam acompanhar este artigo, torna-se leitura obrigatória a série de artigos do Fernando Delunga Garcia sobre Ponteiros. Somente depois de ler todos os artigos desta série maravilhosa, ai sim você estará preparado para continuar com a minha série de Estruturas de Dados. Fechado? Então, vamos começar.

 

Definição

 

Um caractere é uma representação simbólica de um número inteiro. Por exemplo, a letra 'a'  (minúscula) é diferente da letra 'A' (maiúscula). Cada uma delas é representada por um número inteiro diferente, e, consequentemente, um número binário diferente. É dessa forma que o microprocessador consegue processar e distinguir os diferentes símbolos que usamos em nossa Língua Natural (Português do Brasil). Atualmente a codificação padrão de caracteres é o UNICODE. Podemos trabalhar com símbolos em programação usando o tipo de dado caractere. Exemplo:

 

 

char é a palavra-chave reservada na Linguagem C para o tipo de dados caractere. letra é o nome que eu dei para a minha variável do tipo char, a qual armazenará UM único caractere (pode ser símbolos, acentos, pontuação, números, etc). Note que usei aspas simples para tratar caracteres individuais e %c para imprimir na saída do console. Bom, mas e se precisarmos trabalhar com uma palavra, ou até mesmo texto? Nesse caso temos de usar uma cadeia (ou conjunto) de caracteres (strings), que nada mais é que um vetor de caracteres. Várias linguagens de programação de alto nível fornecem um mecanismo pronto para trabalhar com string, como é o caso de Java. Entretanto, linguagens como C deixam isso a cargo do programador. Uma string é então tratada como uma única entidade, exemplos:

 

 

Note que usei aspas duplas para strings ao invés de aspas simples, usado com caractere. Em linguagem C uma String é declarada como um vetor de caracteres que termina com um caractere nulo ('\0') na última posição dessa String. Dessa forma, cadeia de caracteres é uma sequência contígua de caracteres que termina com um caractere nulo, o qual é incluso na cadeia. Esse terminador é extremamente importante pois várias operações e funções com cadeias de caracteres foram desenvolvidas pressupondo a sua existência. A função printf(), por exemplo, imprime tudo que estiver em %s até encontrar esse terminador.

 

Exemplo de String - Cadeia de Caracteres
Figura 1: Exemplo de String

 

A figura 1 ilustra um exemplo de String, mostrando como o vetor de caracteres armazena o valor "ANA CECÍLIA MELO". Esse vetor tem 17 posições, incluindo os espaços e o "\0", na última posição, que é o terminador da String. Importante ressaltar aqui que Strings podem ser manipuladas como ponteiros. Isto significa que existe um ponteiro para o primeiro caractere da String, exatamente como acontece com vetores e matrizes. Exemplo:

 

 

A primeira linha declara um array de caracteres "nome" e o inicializa com o valor "Elaine", o qual tem 7 elementos: 'E', 'l', 'a', 'i', 'n', 'e', '\0'. A segunda linha faz exatamente a mesma coisa, porém a inicialização é um pouco diferente. Ao invés de atribuir a String inteira de uma única vez, cada caractere é atribuído separadamente, dentro de um colchetes, que representa o conjunto de valores daquele array. Em ambas as formas de declaração e inicialização o tamanho do vetor não é fornecido, mas dessa forma o tamanho é definido automaticamente com base no número de caracteres que estão presentes na lista de inicialização. Por fim, a terceira linha cria uma variável de ponteiro chamada 'pNome', a qual aponta para a String "Elaine" que está armazenada em alguma parte da memória, o que está ilustrado na Figura 2.

 

Ponteiro para String - Cadeia de Caracteres
Figura 2: Ponteiro para String

 

É importante reforçar aqui a questão do tamanho do array. Sempre que for utilizar um array de caracteres, tenha em mente o tamanho da maior String que poderá ser armazenada por ele. Se você armazenar menos caracteres do que o previsto, tudo bem, não haverá consequências, mas se por um acaso a sua String for maior que o tamanho definido, os caracteres que ultrapassarem o final do array sobrescreverão dados em posições da memória que sucederem o array, e isso pode se tornar um grande problema. Portanto, muito cuidado. Além de inicializar as Strings diretamente, você também pode obter Strings do teclado, usando scanf(), como mostra o exemplo abaixo:

 

 

É preciso tomar alguns cuidados com a função scanf() ao ler strings, isto porque essa função lerá caracteres até que um espaço, tabulação, nova linha ou indicador de fim de arquivo seja encontrado. Significa que, se você digitar “Ana Cecília Melo”, apenas “Ana” será armazenado pois o espaço digitado logo em seguida indicará o fim da leitura. Assim, você precisará aprender um pouco mais sobre funções de entrada e saída formatada, para saber qual a melhor função a usar de acordo com o problema que está resolvendo. A função scanf() também permite ler uma quantidade definida de caracteres, veja:

 

 

Ao fazer isso você permitirá a leitura de 9 caracteres, isso porque devemos separar uma unidade para o caractere de finalização “\0”. Ainda assim, se você digitar um espaço, a leitura do teclado terminará. Vamos ver um exemplo completo com sua respectiva saída para elucidar melhor o que de fato acontece nos bastidores.

 

 

Saída no console do Scanf
Figura 3: Saída no console do Scanf

 

Observe que neste exemplo foi digitado um nome completo, sem abreviaturas, mas apenas o primeiro nome foi de fato armazenado pela cadeia de caracteres. Isso ocorre pois a função scanf() lê cada caractere digitado e os armazena a partir do endereço “nome”, mas quando um espaço é digitado o processo termina e, nesse ponto, na posição seguinte do array de entrada é inserido o terminador “\0”.

 

Outro ponto a ser observado na função scanf() é a forma de acesso da variável “nome”. Costumeiramente usamos “&salario”, “&idade”, etc., mas aqui o operador & não está sendo utilizado. Isso ocorre pois estamos trabalhando com um array e “nome” aqui é equivalente a “&nome[0]”. Como já dito anteriormente, o identificador dado a um array é o seu endereço inicial, o qual está na primeira posição do array. Vamos ver um exemplo que demonstra a utilização de uma quantidade definida de caracteres:

 

 

Saída no console
Figura 4: Saída no console

 

 

Finalizando

 

Sobre cadeia de caracteres, temos muito o que aprender, e, portanto, vamos terminar este artigo aqui para não ficar muito extenso e cansativo. No próximo artigo vou falar um pouco sobre outras funções para leitura de strings, assim como outras funções para manipulação de strings.

 

Ficou com dúvidas? Deixe aí nos comentários ok! Até pessoal.

Outros artigos da série

Cadeia de Caracteres: Funções de Entrada e Saída >>
Este post faz da série Cadeia de Caracteres. Leia também os outros posts da série:

Bacharel em Engenharia de Computação. Mestre em Ciência da Computação. Cantora, Professora Universitária, Geek, Nerd, Otaku e Gamer. Apaixonada por Michael Jackson, Macross, Mulher Maravilha, Superman, Cervejas Artesanais/Especiais e Voleyball. Informações adicionais você encontra em: http://lattes.cnpq.br/8559022477811603.

Deixe um comentário

Seja o Primeiro a Comentar!

Notificar
avatar
wpDiscuz