Baixe o app para aproveitar ainda mais
Prévia do material em texto
Strings Alexandre Mota acm@cin.ufpe.br Strings = Vetor de caracteres Na linguagem de programação C, uma frase (ou string) não é um tipo de dado específico Faz-se simplesmente o reuso do tipo de dado básico char Assim, uma string de tamanho 10 é declarado como: ◦ char nome[10]; Inicialização Tal qual um vetor tradicional, uma string pode ser inicializada na declaração Da seguinte forma: ◦ char nome[10] = “Joao”; Note que como é um vetor também poderia ser inicializado assim: ◦ char nome[10] = { ‘J’, ‘o’, ‘a’, ‘o’, ‘\0’}; Aparece um curioso caracter ‘\0’ no final. Ele marca o final da string String “…” versus ‘…’ Strings usam aspas e apóstrofos são para caracteres individuais A string “Joao” (4 caracteres visíveis) na verdade correspondem à seqüência { ‘J’, ‘o’, ‘a’, ‘o’, ‘\0’ } O caracter ‘\0’ que marca o final da string ocupa uma posição Assim, para a declaração char nome[10], na verdade temos no máximo 9 caracteres úteis a usar O Caracter ‘\0’ Este caracter especial é usado para demarcar o final da string E permitir que tamanhos variáveis possam ser usados sem usuário se preocupar em controlar isto Casos extremos (para char nome[10]): ◦ Um nome vazio seria nome[0] = ‘\0’; ◦ Um nome cheio seria nome = “abcdefghi”; Lendo strings pelo teclado O comando básico para isto é o scanf Supondo que temos uma string chamada nome O comando ◦ scanf(“%s”, nome); Carrega o que for digitado pelo teclado nesta variável Note que a variável não tem o & como prefixo. Isto será explicado posteriormente Infelizmente este comando, com estes parâmetros, só lê strings sem espaços internos! Lendo strings mais complexas Para ler strings com espaços internos, precisamos usar esta nova configuração ◦ scanf(“ %[^\n]”, nome); O espaço antes de % instrui C a descartar espaços antes da primeira palavra A seqüência de controle ^\n instrui C a ler toda a seqüência de caracteres até encontrar um \n (<ENTER>) Mas esta configuração ainda tem um problema. O caracter \n não pode surgir além do que a string comporta (Violação de memória)! Exercício Faça um programa em C que leia seu primeiro e último nomes, bem como seu sexo (como char M ou F), e mostre na tela o seguinte: Sr. Último, Primeiro (se for Masculino) Sra. Último, Primeiro (se for Feminino) Obs.: Com char usa-se ‘’ e como vetor de chars (strings), usa-se “” Limitando tamanho de leitura Precisamos garantir que a string lida caberá na variável, sem violar limites de memória Então, supondo a declaração ◦ char nome[21]; Usamos a seguinte configuração ◦ scanf(“ %20[^\n]”, nome); Note o 20 vs 21 entre declaração e scanf. Por que isto ocorre? Alternativa de leitura A função gets é bem mais simples que a função scanf Para ler string nome, basta ◦ gets(nome); A sua única desvantagem é que não limita o tamanho de uma string lida Pode violar memória e causar mal funcionamento do programa Trabalhando com strings Como strings são vetores, há comandos especiais para lidar com elas Por exemplo, não se pode atribuir uma string diretamente exceto na inicialização ◦ char nome[10]; ◦ nome = “Alex”; // Está incorreto!!! É preciso usar uma biblioteca chamada string.h, onde há várias funções pré- definidas Atribuição O simples comando de atribuição ◦ nome = “Alex”; O qual está incorreto, deve ser substituído pela função (correto) ◦ strcpy(nome, “Alex”); A função strcpy (string copy) está definida na biblioteca string.h, a qual se faz necessária para compilar corretamente tais programas Função strcpy Por trás da função strcpy ◦ strcpy(novo, antigo); // Equival. a novo = antigo Há um programa bem simples Este programa copia cada posição do vetor (string) antigo para a posição correspondente no vetor (string) novo Algo como: ◦ i = 0; while(antigo[i]!=‘\0’) { novo[i] = antigo[i]; i++ } Função strcpy Note pelo código anterior que o comando de atribuição não existe para strings Mas a função strcpy é definida em termos do comando de atribuição entre elementos de vetores Caracter especial ‘\0’ serve de ponto de parada, como já havíamos dito anteriormente Acumulando dados Do mesmo modo que temos o comando x = x + 2 para inteiros Temos um correspondente para strings É a função strcat (string catenation) Uma chamada como ◦ strcat(novo, antigo); É equivalente ao comando (incorreto para strings) ◦ novo = novo + antigo; Exercício Faça um programa que declara 2 strings, uma de 30 caracteres e outra de 15 caracteres. Leia do teclado ambas as strings mas com no máximo 14 caracteres cada. Concatene a string de 15 caracteres ao final da de 30 sem usar o comando strcat. Apresenta a string resultante. Comparações e strcmp Além de não termos atribuição, também não podemos comparar strings como os demais tipos Por exemplo, enquanto podemos fazer ◦ x == y, ou x < y para números e até caracteres Para strings, precisamos usar a função strcmp (string comparison) Função strcmp A chamada ◦ strcmp(string1, string2) retorna um número inteiro Há 3 casos possíveis: ◦ 0 significa que string1 e string2 são iguais ◦ Negativo significa que string1 é menor que string2 ◦ Positivo significa que string1 é maior que string2 Função strcmp Tal qual a função strcpy é definida, a função strcmp funciona nos elementos internos dos vetores Resultado da função é basicamente uma operação aritmética baseada na i-ésima posição dos vetores de caracteres ◦ string1[i] – string2[i] Note que expressão dá 0 se caracteres forem iguais, > 0 se … e < 0 se … Exercício Faça um programa que resulta no mesmo comportamento da função strcmp para duas strings de tamanhos 20 e 15 respectivamente. Tamanho de uma string Apesar da declaração definir um tamanho para uma string Vimos que o caracter ‘\0’ permite tamanhos dinâmicos Baseada na posição do caracter ‘\0’, a função strlen resulta no tamanho (núm. natural) dinâmico da string Seu uso é: ◦ strlen(nome); Exercício Como seria a implementação da função strlen? Faça um programa que exiba este mesmo comportamento. Exercício Faça um programa que lê uma string de no máximo 10 caracteres e informa ao usuário se ela é um palíndromo Isto é, se a palavra lida é idêntida a sua versão invertida ◦ Ex.: ama ou anilina ou arara Limpando o buffer A entrada de dados pelo teclado pode ficar acumulada Se isto ocorrer, o scanf pode não funcionar corretamente (“Pular a entrada”) Se isto ocorrer, você deverá usar: ◦ fflush(stdin) [Windows] ou __fpurge(stdin) [Linux] ou rewind(stdin) Antes de cada scanf Strings Alexandre Mota acm@cin.ufpe.br
Compartilhar