image

Acesse bootcamps ilimitados e +650 cursos

50
%OFF
Article image
Fernando Araujo
Fernando Araujo19/09/2024 09:17
Compartilhe

<Direto ao Ponto 47> Estruturas de Dados - Cadeias de caracteres (Strings)

  • #Informática Básica

Artigos desta série: ( < ) Anterior | Índice | Seguinte ( > )

 

Olá, dev!

 

Este é mais um artigo da série DIRETO AO PONTO, que eu estou escrevendo para a DIO. Ele vai tratar das cadeias de caracteres, mais conhecidas como strings, presentes em todas as linguagens de programação.

 

Sumário

1. Introdução

2. Os textos na programação

3. O tipo string

4. Exemplos de aplicações implementadas com strings

5. Considerações finais

6. Referências

 

 

1 – Introdução

 

Eu criei a série de artigos DIRETO AO PONTO com o objetivo de apresentar, de forma simples e direta, conhecimentos básicos da programação e de computação, principalmente, para os iniciantes.

 

Aqui, são tratados de temas como lógica de programação, linguagens, hardware dos computadores, história da computação e assuntos relacionados à plataforma da DIO, como a escrita de artigos e os desafios de código.

 

Neste artigo, eu vou falar sobre as cadeias de caracteres, mais conhecidas como strings, presentes em todas as linguagens de programação.

  

 

2 – Os textos na programação

 

As primeiras linguagens de programação foram criadas com o objetivo de realizar cálculos trabalhosos ou complexos, facilitando o trabalho de cientistas.

 

Os primeiros equipamentos de calcular tinham este objetivo, bem como os primeiros computadores eletrônicos. O ENIAC implementava formas de se calcular trajetórias de tiros para uso pelo exército na Segunda Guerra Mundial.

 

Os algoritmos e as primeiras linguagens implementavam equações diferenciais complicadíssimas para serem calculadas manualmente.

 

Na década de 50 e 60, os computadores eram usados para NASA para os cálculos de lançamento e das trajetórias dos foguetes espaciais.

 

No entanto, logo se notou que a capacidade de armazenamento, velocidade e a aplicação de algoritmos dos computadores também poderiam ser usados para o tratamento de dados textuais.

 

Uma das primeiras linguagens de programação de alto nível, o FORTRAN, já oferecia tipos de dados para a manipulação de caracteres, o tipo char.

 

Além dele, a linguagem também oferecia uma maneira de se representar e manipular dados textuais, ou cadeia de caracteres (strings). Ele usava a estrutura de dados vetor para armazenar vários caracteres de forma sequencial como elementos de um vetor, estrutura oferecida pela linguagem para armazenar números inteiros e reais.

 

A linguagem COBOL, da mesma época do FORTRAN, voltada para processamento de dados de negócios, também oferecia estruturas de dados para manipular dados textuais.

 

Atualmente, todas as linguagens de programação modernas oferecem estruturas de dados e tipos para manipulação e processamento de dados textuais, ou strings.

 

Algumas usam a estrutura vetor para implementar strings e outras já oferecem um tipo de dado mais específico. E todas oferecem funções específicas para manipulação de strings, sejam as mesmas que tratam de vetores ou funções específicas para strings.

 

 

3 – O tipo string

 

Strings são muito usados na programação para armazenar e manipular sequências de caracteres, como palavras, frases ou qualquer tipo de texto. Eles são usados em diversas aplicações, como estas listadas a seguir:


·        Entrada e Saída de Dados: recebimento e exibição de dados textuais, de dispositivos de entrada e saída (teclado, telas, etc.), interfaces de usuário, arquivos de log, comandos e scripts de configuração em sistemas operacionais e comunicação entre sistemas;

 ·        Armazenamento de Dados: Uso de formatos textuais padronizados usados em bancos de dados e APIs, como JSON, XML, CSV etc;

 ·        Criptografia e Codificação: uso fundamental na criptografia, hashing e na codificação/decodificação de informações;

 ·        Análise de Linguagem Natural (NLP): Processamento e análise de texto em classificação de texto, reconhecimento de fala, e tradução automática;

 ·        Programação Web: manipulação de arquivos HTML, CSS e JavaScript, respostas HTTP e construção de sites dinâmicos.

 

Os strings armazenam caracteres de acordo com uma padronização de bases. No início, os caracteres usados eram da famosa tabela ASCII (ou da EBCDIC, da IBM), que oferecia 256 caracteres alfanuméricos, caracteres de pontuação, e alguns de controle dos dispositivos de impressão.

 

Os strings atuais usam as codificações UTF-8 ou UTF-16, que???, respectivamente.

 

A alocação de memória pode ser estática, com tamanho (número de elementos – caracteres) fixo, ou dinâmica, que permite aumento automático do tamanho, quando necessário (o vetor chega ao limite).

 

Algumas linguagens (como C) oferecem strings mutáveis, permitindo que os seus caracteres sejam alterados durante o programa. Outras (como Python e Java) oferecem strings imutáveis, que não podem ser modificados; se forem, será gerado um novo string.

 

Atualmente, as linguagens de programação (C++, C#, Java, Kotlin) oferecem strings como uma classe nativa, com vários métodos para a manipulação deles, e gerenciamento de memória automático, realizado pela própria linguagem.

 

As funções mais comuns de manipulação de strings são:

·        Concatenação – junta 2 strings em sequência;

·        Comprimento – informa o tamanho do string, sem contar o caractere final (‘\0’);

·        Comparação – compara lexicamente 2 strings, qual deles vem antes do outro na ordem alfabética;

·        Conversão – conversão para maiúsculas ou minúsculas;

·       Substrings – Extração de partes específicas de uma string;

·      Expressões Regulares – Busca e substituição complexa de padrões dentro de strings.

 

A forma de tratamento de strings da linguagem C merece uma explicação à parte. Eles são armazenados em um vetor (array), da mesma forma que os tipos inteiros e os reais.

 

No artigo anterior, eu tratei dos vetores e detalho um pouco como eles funcionam, inclusive na linguagem C. A declaração de uma variável do tipo vetor estático determina o nome da variável, o tipo dos elementos que serão armazenados e o tamanho do vetor (número de elementos que ele armazenará).

 

Ponteiro


O nome da variável é um tipo específico da linguagem chamado ponteiro (pointer), que indica o endereço da primeira posição de memória que armazena os elementos do vetor, sequencialmente.

 

Um ponteiro é a forma de se passar um parâmetro (passagem por referência) para uma função de forma que ele possa ser alterado dentro da função. A outra forma, passagem por valor, apenas copia o valor da variável original para a variável do parâmetro da função e modificações feitas no parâmetro dentro da função não alteram a variável original. 

 

String em C

 

Além do ponteiro, um string em C é sempre finalizado por um caractere ‘\0’ (chamado de caractere nulo), para sinalizar o final do string, e o espaço para armazenar este caractere deve ser reservado no vetor que armazena o string.

 

Sem este caractere final, o conteúdo do vetor não será tratado como um string, mas apenas como um vetor de caracteres. No entanto, o tamanho do string só leva em consideração os carateres, sem o caractere nulo.

 

Veja como se dá usa um string em C:

 

Declaração de um vetor de caracteres:

char vetor1[ ] = {‘t’, ‘e’, ‘s’, ‘t’, ‘e’}; // Na memória, ficaria assim: | t | e | s | t | e |

 

O valor da variável vetor1 é o endereço inicial da memória onde estão armazenados estes 5 caracteres.

 

Declaração de um string de caracteres:

char vetor2[ ] = {“teste”};  // Na memória, ficaria assim: | t | e | s | t | e | \0 |

 

O valor da variável vetor2 é o endereço inicial da memória onde estão armazenados estes 5 caracteres, mais o caractere ‘\0’, portanto, 6 elementos.

 

O acesso aos elementos do string é feito da mesma forma que nos vetores, por meio de índice, que proporciona uma varredura sequencial de forma rápida e direta.

 

O gerenciamento de memória de strings em C deve ser feito pelo próprio programador e isso pode levar a erros, até graves, que podem comprometer a segurança de sistemas inteiros, por alguém (hacker) que, maliciosamente, saiba aproveitar as falhas.

 

Finalmente, é importante lembrar que a linguagem C++ também oferece a mesma forma de uso de strings que C, mas também oferece o tipo alternativo de classe de strings.

 

 

4 – Exemplos de aplicações implementadas com strings

 

Exemplo em C – inicializando um string e imprimindo em ordem inversa

 

#include <stdio.h>
#include <string.h>
 
int main() {
 char vetor[] = "Direto ao Ponto"; // Inicializando o vetor com a palavra
 
 // Imprimindo a palavra na ordem inversa
 for (int i = strlen(vetor) - 1; i >= 0; i--) {
     printf("%c", vetor[i]);
 }
 printf("\n");
 
 return 0;
}

  

 

Exemplo em C# - ordenando strings e escrevendo em maiúsculas

 

using System;
 
namespace OrdenacaoStrings
{
 class Program
 {
     static void Main()
     {
         // Inicializando as strings
         string palavra1 = "zebra";
         string palavra2 = "gato";
         string palavra3 = "cachorro";
         string palavra4 = "raposa";
 
         // Criando um array com as palavras
         string[] palavras = { palavra1, palavra2, palavra3, palavra4 };
 
         // Ordenando o array em ordem alfabética
         Array.Sort(palavras);
 
         // Imprimindo as palavras em letras maiúsculas
         Console.WriteLine("Palavras ordenadas em letras maiúsculas:");
         foreach (string palavra in palavras)
         {
             Console.WriteLine(palavra.ToUpper());
         }
     }
 }
}

 

 

Exemplo em Python – procurando um subtring dentro de um string maior

 

def busca_palavra(texto, palavra):
 indice = texto.find(palavra)
 if indice != -1:
     print(f"A substring '{palavra}' foi encontrada na posição {indice}.")
 else:
     print(f"A substring '{palavra}' não foi encontrada na string.")
 
# Exemplo de uso:
 
texto_completo = " Este é mais um artigo da série DIRETO AO PONTO, que eu estou escrevendo para a DIO."
palavra_menor = "artigo"
verifica_substring(texto_completo, palavra_menor)

 

 

5 – Considerações finais

 

 

Este é mais um artigo da série DIRETO AO PONTO, que eu estou escrevendo para a DIO. Neste artigo eu tratei das cadeias de caracteres (strings), base de todo o tratamento e processamento de textos pelos computadores.

 

Os primeiros computadores foram criados com o objetivo de realizarem cálculos que eram difíceis ou muito trabalhosos para os técnicos fazerem manualmente. Desde as primeiras linguagens de programação, o processamento de textos também foi incorporado às tarefas realizadas pelos computadores. No início, eram tratados apenas como caracteres individuais ou como vetores de caracteres.

 

Com o passar do tempo e as necessidades de processamento de textos aumentando, principalmente em aplicações comerciais, a oferta de uma melhor representação dos caracteres pelas linguagens de programação foi melhorando. A necessidade de garantir a segurança dos textos utilizados pelos computadores, cujo gerenciamento era realizado pelos programadores, principalmente na linguagem C e C++.

 

Atualmente, as principais linguagens de programação oferecem uma nova maneira de se representar e manipular strings de forma segura, com o gerenciamento feito automaticamente pela própria linguagem.

 

No próximo artigo, eu vou falar das matrizes, que são uma espécie de vetores multidimensionais, também muito usados em programação.

 

 

6 – Referências

 

Praticamente todo o conteúdo deste artigo foi tirado do que eu aprendi (e me lembro) sobre o assunto desde o início da minha carreira como programador, desde os anos 80 até agora.

 

Para criar os códigos dos exemplos, eu consultei o ChatGPT e fiz algumas correções necessárias para sair do jeito que eu queria. Todos os códigos foram testados e rodaram sem problemas.


Para a elaboração da lista de tipos de estruturas de dados oferecidas por algumas linguagens, eu consultei as ferramentas ChatGPT e Copilot.

 

Artigos desta série: ( < ) Anterior | Índice | Seguinte ( > )

Compartilhe
Comentários (0)