Linguagem C - Aula 6.2 - Strings: trabalhando com dados de texto em C (2022)
Introdução aos Vetores em C
Conceitos Básicos de Vetores
- O apresentador inicia a discussão sobre vetores, enfatizando sua importância para manipulação robusta de dados em C.
- É mencionado que os vetores têm um tamanho
n, com índices variando de 0 atén - 1, e que a linguagem C não verifica limites em tempo de compilação, o que pode levar a comportamentos imprevisíveis.
- A inicialização dos vetores é abordada; ao declarar um vetor, suas posições podem ser preenchidas diretamente nas chaves.
Manipulação de Dados com Laços
- O uso comum de laços (como
for) para iterar sobre os elementos do vetor é discutido, permitindo acesso às posições do vetor.
- Exemplos práticos são apresentados, como somar valores armazenados no vetor e imprimir resultados na tela.
Vetores e Strings: Armazenamento de Texto
Transição para Strings
- O apresentador introduz o conceito de strings como vetores de caracteres, permitindo o armazenamento de palavras e frases inteiras.
- É explicado que uma variável do tipo
chararmazena apenas um único caractere alfanumérico devido à limitação dos 8 bits.
Estrutura das Strings em C
- A complexidade do trabalho com strings em C é destacada, comparando-a com outras linguagens mais abstratas como Java.
- A necessidade de entender como os dados são armazenados na memória é enfatizada para manipular corretamente as strings.
Estrutura Interna dos Vetores de Caracteres
Representação na Memória
- Cada posição do vetor deve conter um caractere distinto da palavra ou frase. Um exemplo visual é fornecido sobre como isso se organiza na memória.
- O conceito do caractere nulo (
0) é introduzido; ele indica o final da string e deve ser incluído no vetor para delimitar corretamente o texto armazenado.
Importância do Caractere Nulo
- Para armazenar uma string com 10 caracteres, são necessárias 11 posições no vetor devido à inclusão do caractere nulo.
Leitura de Strings em C
Introdução ao Vetor de Caracteres
- Um vetor de 10 posições é utilizado para armazenar texto, onde a 11ª posição contém um caractere nulo. Isso permite que as dez posições anteriores guardem o texto digitado pelo usuário.
- O uso do especificador
%snoscanfé comum para ler strings, mas tem limitações quando se trata de espaços e frases completas.
Limitações do scanf
- O
scanfpode ler uma string inteira sem precisar acessar letra por letra, mas não consegue lidar com espaços; ele interrompe a leitura ao encontrar um espaço.
- A leitura via
scanfsó armazena até o primeiro espaço, ignorando qualquer texto subsequente que o usuário digitar após esse ponto.
Problemas com Tamanho do Vetor
- Se o usuário tentar inserir um texto maior que o tamanho do vetor (por exemplo, 20 caracteres em um vetor de 10), isso pode causar problemas na leitura e armazenamento dos dados.
- É importante garantir que a entrada do usuário não exceda o tamanho definido para evitar sobreposição e corrupção de dados.
Sintaxe Aprimorada
- Uma sintaxe aprimorada permite especificar o tamanho da string a ser lida e incluir espaços. Isso é feito utilizando expressões como
%[^n], permitindo capturar toda a linha até o Enter.
- O uso do acento circunflexo (
^) dentro da expressão ajuda a definir quais caracteres devem ser lidos ou ignorados durante a captura da string.
Exemplo Prático
- Na prática, essa sintaxe parece complexa, mas é simples: define-se o tamanho máximo da string menos um (para incluir o caractere nulo).
- Ao usar
%[^n], todos os caracteres digitados até pressionar Enter são capturados corretamente, incluindo espaços.
Impressão de Strings
- Para imprimir uma string na tela usando
printf, utiliza-se também especificadores de formato como%s.
- É necessário passar os vetores corretos para serem impressos no console, garantindo que cada variável seja referenciada adequadamente.
Conclusão sobre Uso Prático
- A compreensão dessas técnicas facilita muito a manipulação de strings em C. Com exemplos práticos, fica mais claro como aplicar essas regras na programação.
Introdução ao Uso de scanf e Boas Práticas
Sintaxe Básica do scanf
- O uso da função
scanfé introduzido, destacando que a variável utilizada é um vetor de caracteres, sem necessidade do operador comercial (&).
- É recomendado chamar a função
fflush(stdin)após o uso doscanf, como uma boa prática para garantir a limpeza do buffer de entrada.
Leitura e Impressão de Dados
- O usuário pode digitar texto via teclado, que será impresso na tela utilizando o formato
%s.
- A variável
%sserá substituída pelo conteúdo inserido pelo usuário em tempo de execução.
Comparação entre scanf Convencional e Aprimorado
- A diferença entre o
scanfconvencional e o aprimorado é discutida; no aprimorado, é possível especificar o tamanho máximo da leitura.
- O uso do circunflexo (
^) dentro dos colchetes permite ler espaços, limitando a leitura a 10 caracteres.
Limitações e Cuidados com Buffer
- Ao usar o
scanfconvencional, se um espaço for digitado, ele interrompe a leitura. Já no aprimorado, todos os 10 caracteres são lidos.
- É importante reservar um caractere para o terminador nulo (
0). Portanto, deve-se ler atén - 1caracteres para evitar problemas.
Testes com Entrada de Dados
- Um teste prático mostra que ao tentar ler mais caracteres do que permitido (11 em vez de 10), ocorre uma violação da memória.
- O método aprimorado garante que o último caractere seja sempre reservado para o terminador nulo automaticamente.
Funções Alternativas para Entrada de Dados
- A aula menciona outras funções como
gets()e suas limitações. A funçãofgets()é sugerida como uma alternativa mais segura.
Manipulação de Strings em Linguagem C
Função para Limitar o Tamanho da String
- A função permite que o nome da string seja definido diretamente no parâmetro, facilitando a manipulação sem necessidade de ajustes manuais como "n-1".
- O uso do
STDINé destacado como entrada padrão, onde a função lê dados do teclado e reserva espaço para o caractere nulo (0) no final da string.
Impressão de Strings
- A função
printfé utilizada para imprimir strings na tela, aceitando apenas argumentos do tipo string, não permitindo outros tipos como inteiro ou float.
Importância do fflush
- O comando
fflush(stdin)é essencial após entradas de dados, especialmente com tipos como float e char, para evitar problemas nas leituras subsequentes.
- Sem o uso do
fflush, pode ocorrer um "lixo" no buffer que interfere nas próximas leituras, resultando em comportamentos inesperados.
Exemplos Práticos
- Um exemplo prático demonstra a importância de usar
fflush. Ao removê-lo, as entradas podem ser puladas ou ignoradas.
- O teste mostra que ao digitar uma string e não usar
fflush, a leitura seguinte falha devido à presença de dados residuais no buffer.
Comportamento das Funções
- É enfatizado que sempre deve-se utilizar
fflushapós funções que leem dados para garantir que as próximas leituras funcionem corretamente.
Leitura e Limitação com fgets
- A função
fgetsé apresentada como uma alternativa segura para ler strings, mas não controla automaticamente o limite de tamanho do vetor.
Conclusão sobre Funcionalidades em C
- O programa finaliza mostrando a execução correta das funções com controle adequado sobre as entradas e saídas.
Manipulação de Strings em C
Introdução às Funções de Manipulação de Strings
- A manipulação de strings em C pode ser trabalhosa, especialmente ao lidar com atribuições e funções específicas. A função
strcpyé fundamental para facilitar essa tarefa.
- Variáveis simples do tipo
intpodem ser atribuídas diretamente, mas isso não se aplica a strings, que requerem métodos específicos para modificação.
Uso da Função strcpy
- Para alterar o conteúdo de uma string já declarada, deve-se usar a função
strcpy, pois a atribuição direta não é permitida.
- É importante anotar que strings não podem ser alteradas usando o operador igual; apenas
strcpypode modificar seu conteúdo.
Funcionamento da strcpy
- A sintaxe da função
strcpyenvolve especificar um destino e uma origem:strcpy(destino, origem);.
- O conteúdo da string origem pode ser uma string literal ou outra variável do tipo string.
Exemplo Prático com strcat
- Para concatenar duas strings (por exemplo, nome e sobrenome), utiliza-se a função
strcat, que combina as duas strings na string de destino.
- O resultado da concatenação armazena o nome completo na variável designada como destino.
Comparação de Strings com strcmp
- A função
strcmpcompara duas strings e retorna zero se forem idênticas. Isso permite verificar igualdade entre elas dentro de estruturas condicionais.
- Se as strings forem diferentes,
strcmpretornará um valor diferente de zero, indicando que elas não são iguais.
Importância da Biblioteca locale.h
- A inclusão da biblioteca
locale.hé crucial para permitir o uso correto de acentos em programas C.
- Ao configurar a localidade para português (
setlocale(LC_ALL, "pt_BR");), os caracteres acentuados serão exibidos corretamente nas saídas do programa.
Exemplos Práticos e Configurações Necessárias
- Antes de utilizar funções como
strcpy, é necessário incluir as bibliotecas apropriadas no início do código (#include <string.h>).
- Definir constantes para tamanhos das strings facilita a manutenção do código. Por exemplo, definir uma constante N = 20 controla o tamanho das variáveis string utilizadas no programa.
Demonstração do Uso das Funções
- Um exemplo prático mostra como copiar o conteúdo "Olá Mundo" para uma nova variável utilizando
strcpy, demonstrando claramente a diferença entre atribuição direta e uso adequado dessa função.
Manipulação de Strings em C
Introdução à Impressão e Destino de Strings
- O apresentador imprime "Olá Mundo" e menciona que o conteúdo de destino é um lixo de memória, indicando a importância da inicialização correta das variáveis.
- É destacado que para alterar conteúdos de strings, a função
strcpydeve ser utilizada, enfatizando sua relevância na manipulação de strings.
Concatenando Strings com strcat
- O exemplo mostra como usar
strcatpara concatenar duas strings: S1 (lógica) e S2 (programação), demonstrando a junção dos conteúdos.
- Após a concatenação, o conteúdo da string S1 agora contém tanto "lógica" quanto "programação", ilustrando o funcionamento do
strcat.
Leitura e Tamanho Dinâmico de Strings
- O apresentador utiliza
fgetspara ler uma string do usuário sem limitar o número de caracteres, destacando a flexibilidade dessa abordagem.
- A função
strlené usada para contar quantos caracteres foram digitados pelo usuário, mostrando como gerenciar entradas dinâmicas.
Iteração sobre Caracteres em uma String
- Um loop é implementado para imprimir cada caractere individualmente da string lida, utilizando um índice que percorre toda a extensão da string.
- O apresentador demonstra que mesmo ao modificar o método de impressão, os resultados permanecem consistentes.
Comparação entre Strings
- Uma nova string chamada "hard text" é introduzida com um comando específico. O objetivo é comparar essa string com uma entrada do usuário.
- A comparação entre as strings é realizada usando
strcmp, onde se verifica se as duas strings são iguais ou não.
Introdução às Strings em C
Estrutura e Armazenamento de Strings
- As strings são representadas como vetores, onde cada posição armazena um caractere alfanumérico. O caractere nulo (
0) é utilizado para indicar o final da string.
Funções de Entrada e Saída
- A função
scanftem limitações ao lidar com strings, pois não admite espaços e pode causar problemas se a leitura extrapolar o tamanho do vetor. Para contornar isso, podemos usar especificadores de formato mais rigorosos.
- Outras funções como
getsefgetspermitem a leitura de strings, sendo quefgetsé preferível por limitar o número de caracteres lidos, evitando estouros de buffer.
Melhores Práticas na Leitura de Dados
- A função
fgetsé recomendada para armazenar dados limitando o número máximo de caracteres, além de reservar espaço para o caractere nulo no final da string.
- É uma boa prática utilizar
fflush(stdin)após leituras para limpar o buffer do teclado e evitar erros nas próximas entradas.
Manipulação de Strings
- Funções como
strcpy,strcat, estrcmpsão essenciais na manipulação de strings em C. O uso correto dessas funções permite copiar, concatenar e comparar strings eficientemente.
- Lembrar que atribuições diretas entre strings não são permitidas; deve-se sempre usar funções específicas para manipular conteúdo entre elas.
Conclusão