Buscar

07 - Introdução à Programação - Strings

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

Continue navegando