You are on page 1of 24

COMPUTAÇÃO BÁSICA

Disciplina: 116301

Prof. Ricardo Queiroz


Material preparado pela Profa. Carla Castanho

Universidade de Brasília – UnB


Instituto de Ciências Exatas – IE
Departamento de Ciência da Computação – CIC

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


12. STRINGS

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


Seqüências de Caracteres
 A essa altura todos sabemos que computadores são ótimos
para lidar com números e operações lógicas, e já vimos
diversas maneiras de lidar com operações matemáticas
sobre números e operações lógicas, mas para haver uma
melhor interação com os humanos, os computadores
precisam lidar com letras e palavras...
 Como fazer isso?

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


Seqüências de Caracteres
 No computador letras, números, símbolos e sinais de
pontuação possuem uma representação baseada em
números, na qual cada número representa um caractere
diferente.
 Atualmente existem dois padrões que são mais utilizados
para associar números a caracteres, que são o padrão
ASCII (American Standard Code for Information
Interchange) e o padrão UTF-8 (Unicode Transformation
Format de 8 bits). Há ainda outros padrões, como o UTF-16,
o ISO-8859-1, EUC-JP, EUC-KR, etc.
 No padrão ASCII esses números são armazenados em
variáveis de 1 byte (8 bits), que podem representar 256
números diferentes, e no padrão UTF-8 eles possuem
tamanho de representação variável. Aqui nos interessa
apenas a representação de um byte.
Computação Básica – queiroz@ieee.org (c) profa. carla castanho
Tabela ASCII

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


Seqüências de Caracteres
 Então sabemos como representar uma letra, um símbolo,
etc, em um computador, mas como representar uma
seqüência deles, como em, digamos, uma frase?

Podemos fazer isso por meio de VETORES,


onde cada posição do vetor contém uma letra na frase.

 E como o computador sabe onde a seqüência de caracteres


acaba?
 Podemos ter um número associado ao vetor, indicando quantas
posições a partir do início dele são válidas;
 Ou usar um caractere-chave, que indica o fim da string e deve ser
ignorado na impressão da mesma. (Essa última é a abordagem da
linguagem C. )

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


Strings como vetores
 Usaremos então a representação de uma string como um
vetor de caracteres (variáveis do tipo char), e seu final será
representado por uma posição no vetor contendo o valor
NULO.
 Sendo a string um vetor, nada mais natural que fazer
operações similares. Podemos, por exemplo:
 intercalar as letras de uma string formando uma nova string,
 concatenar duas strings,
 acessar um elemento específico,
 ordenar as letras por algum critério, etc.

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


Exemplo
Exemplo:
Faça um algoritmo que declare como variáveis duas strings de 20 posições e uma string de 40
posições. Leia as duas de 20, crie uma intercalação das mesmas, armazenando o resultado na
de 40 e mostrando o resultado na tela. O tamanho das duas strings inseridas será igual e
sempre será menor ou igual a 20 caracteres.
Algoritmo SomaEMedia
Variáveis
i, : inteiro
S1, S2 : vetor[21] de char
S3 : vetor[41] de char
Início
Leia(S1)
Leia(S2)
i←0
Enquanto (S1[i] != NULO) faça
S3[2*i]←S1[i]
S3[2*i+1]←S2[i]
i←i+1
FimEnquanto
S3[2*i]←NULO
Escreva(“String resultante Soma = ”,S3);
Fim
Computação Básica – queiroz@ieee.org (c) profa. carla castanho
Explicação do exemplo anterior
 As variáveis foram declaradas como vetores. O segredo
aqui é notar que elas foram declaradas com uma posição a
mais do que o pedido, pois é necessário armazenar o
caractere NULO sinalizando o final de cada string. A função
Leia armazena esse caractere automaticamente.
 A condição Enquanto (S1[i] != NULO), é utilizada para
testar se a string S1 não chegou ao fim. Neste caso, essa
condição vale pois na especificação do exemplo é garantido
que S1 e S2 terão o mesmo tamanho.
 Observe atentamente a manipulação dos índices dentro do
Enquanto e entenda o que realmente está acontecendo.
 Veja também que ao final do algoritmo colocamos o
caractere NULO em S3, antes de mandar escrever na tela.
Isto é necessário para que a função Escreva tenha o
comportamento esperado.
Computação Básica – queiroz@ieee.org (c) profa. carla castanho
Testes para o exemplo anterior
 1) Analisando o algoritmo apresentado no exemplo anterior,
qual seria a saída do programa caso o usuário insira S1
sendo “abcdefghijklmnopqrst” e S2 sendo
“ABCDEFGHIJKLMNOPQRST”?

“aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStT”

 2) E qual seria a saída se a S1 fosse “AAAAA” e S2 fosse


“BBBBB”?
“ABABABABAB”

 Observe que a condição do Enquanto permite que a string possua


tamanho menor que 20 caracteres, dando certa flexibilidade.

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


Strings em C
 A linguagem C NÃO oferece suporte diretamente ao
tratamento de strings, apenas por meio de bibliotecas, como
a <string.h>.
 Caso o programador não deseje utilizá-las, deverá fazer
tudo manualmente, tendo por base o conceito de vetores de
caracteres, e tratando esses vetores da maneira que já foi
vista nesse curso.

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


Strings em C
 A função scanf precisa ser evocada de maneira especial
para que ela não pare a leitura no primeiro espaço em
branco encontrado, mas somente quando for dado um
<enter>.
 Para ler uma string S sem parar nos espaços (só parando
no caractere de nova linha), use:
scanf("%[^\n]s",string1);
getchar();
 O getchar(); é essencial para limpar o buffer, caso vá ler
algo depois.
 Outra alternativa é:
scanf("%[^\n]s%*c",string1);
 pois o %*c descarta o primeiro caractere que vier após a
string, no caso, o newline, dispensando o getchar();.
Computação Básica – queiroz@ieee.org (c) profa. carla castanho
Strings em C - Exemplo
Exemplo:
Programa em C do algoritmo apresentado anteriormente para fazer
intercalação de duas strings. Aqui presumimos que S1 e S2 terão sempre o
mesmo tamanho e usamos apenas os conceitos de vetores de caracteres, sem
usar a biblioteca <string.h>
#include <stdio.h>
int main () { Pode-se digitar
int i;
char S1[21], S2[21], S3[41]; NULL ou '\0 '
scanf("%s",S1);
scanf("%s",S2);
for (i=0; S1[i]!=‘\0’; i++) {
S3[2*i]=S1[i];
S3[2*i+1]=S2[i];
}
S3[2*i]=‘\0’;
printf("%s\n",S3);
getchar();
return 0;
}

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


A Biblioteca <string.h>
 A biblioteca <string.h> nos provê funções para facilitar o
tratamento de strings. (Seu uso será melhor compreendido
após o estudo de funções.)
 Algumas das funções da biblioteca <string.h>:
FUNÇÃO DESCRIÇÃO
int strlen (char *s) Retorna um inteiro com o tamanho da string s.

char* strstr (char *palheiro, char Essa função procura por *agulha em *palheiro,
*agulha) e retorna um ponteiro para a posição onde
*agulha ocorre, ou NULL caso isso não
aconteça.
int strcmp (char *s1, char *s2) Retorna um número negativo (<0) se s1 for
lexicograficamente menor do que s2, zero se
forem iguais, ou um número positivo (>0) se s1
for lexicograficamente maior do que s1.

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


A Biblioteca <string.h>

 Mais funções da biblioteca <string.h>:


FUNÇÃO DESCRIÇÃO
int strcasecmp (char *s1, char *s2): Possui um funcionamento similar ao da
strcmp, mas ela ignora as diferenças entre
maiúsculas e minúsculas.
char* strcat (char *dest, char Concatena *fonte ao final de *dest, sendo que
*fonte): *dest precisa ter tamanho suficiente para essa
operação. O retorno da função é um ponteiro
para *dest.
char* strcpy (char *dest, char Copia a string em *fonte para a string em
*fonte): *dest, sendo que *dest deve ser grande o
bastante para comportar *fonte.
char* strchr (char *s, char c): Retorna um ponteiro para a primeira
ocorrência do caractere c em s, ou NULL caso
não haja.

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


Exercícios
 ATENÇÃO: Estes exercícios deverão ser feitos SEM a
utilização das funções de <string.h> (exceto para strlen).
1. Faça um programa em C que leia duas strings e concatene-as em uma terceira
string, mostrando o resultado na tela. Você pode definir o tamanho das strings,
lembrando que o usuário poderá informar strings de tamanhos diferentes.

2. Uma prova de 10 questões com cinco alternativas (A, B, C, D e E) de múltipla


escolha foi aplicada em uma turma. Faça um programa que leia o gabarito, o
número de alunos e as respostas de cada aluno, e diga a maior nota obtida.
EXEMPLO DE ENTRADA:
Gabarito: ABCDEABCDE
Nro alunos: 3
Respostas aluno 1: ABCAABAAAA
Respostas aluno 2: ABCDABAAAA
Respostas aluno 3: ABCDEABCDD
EXEMPLO DE SAÍDA:

Maior nota obtida: 9

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


Exercícios
 ATENÇÃO: Estes exercícios deverão ser feitos SEM a
utilização das funções de <string.h> (exceto para strlen).
3. Uma forma rudimentar de compactação pode ser a representação da
multiplicidade de caracteres repetidos. Escreva um programa que leia uma
cadeia de caracteres e para cada um deles que possua adjacentes iguais
a ele, imprima o número de repetições e apenas uma cópia dele, e
imprima apenas o caractere sem o número, caso naquela ocorrência não
haja repetições.
Exemplo de entrada: AAABCCCCCBBBCCAAA
Exemplo de saída: 3AB5C3B2C3A

4. Faça um programa que leia, via teclado, duas strings formadas apenas
por letras e espaços brancos. O programa deve imprimir uma lista das
palavras que aparecem simultaneamente nas duas strings. Pode-se supor
que em cada uma das strings não há palavras repetidas.

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


Exercícios
 ATENÇÃO: Estes exercícios deverão ser feitos SEM a
utilização das funções de <string.h> (exceto para strlen).
5. Crie um programa que leia o nome de uma pessoa (20 caracteres) e o
escreva de trás para frente. Você pode usar a função strlen para descobrir
o tamanho do nome digitado.

6. Faça programa para copiar n caracteres da string s1 na string s2,


começando pela posição i da string s1. O usuário deve informar s1, n, e i.

7. Faça um programa para remover n caracteres de uma string s, a partir


da posição i. O usuário deve informar s, n, e i.

8. Faça um programa que procura uma palavra (pvelha) em uma frase (fr)
e a substitui por outra palavra (pnova). Supõe-se que a frase seja formada
apenas por palavras e espaços brancos, podendo haver qualquer
quantidade de espaços em branco entre as palavras.

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


Exercícios
 ATENÇÃO: Estes exercícios deverão ser feitos SEM a
utilização das funções de <string.h> (exceto para strlen).
9. Faça um programa que leia, via teclado, uma string formada apenas por
letras e espaços brancos. O programa deve gerar outra string, formada
por essas palavras, na mesma ordem, mas cada uma delas escrita em
ordem inversa.
Exemplo:
Entrada: abcd ghi rstu vwxyz
Saída: dcba ihg utsr zyxwv
Obs: Não se esqueça de utilizar o comando scanf("%[^\n]s%*c",string);
para permitir a leitura de espaços em branco.

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


Desafios
1. Escreva um programa para descompactar a seqüência compactada
gerada pelo programa do exercício 3.

2. Um erro comum de digitação é colocar as mãos no teclado uma coluna


à direita da posição correta. Com isso o 'Q' será digitado como 'W', o 'J'
como 'K' e assim por diante. Escreva um programa que decodifique uma
mensagem digitada dessa maneira. A entrada do seu programa conterá
uma linha escrita dessa forma, e ela pode conter caracteres maiúsculos,
espaços, números e sinais de pontuação. Seu programa deve fazer a
correção em função do layout de teclado abaixo. Espaços em branco na
entrada devem ser reproduzidos na saída.
Exemplo de entrada: O S, GOMR YPFSU/
Exemplo de saída: I AM FINE TODAY.

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


Vetores de strings
 Vetores de strings são matrizes bidimensionais de
caracteres.
 Imagine uma string. Ela é um vetor. Se fizermos um vetor de
strings estaremos fazendo uma lista de vetores.
 Esta estrutura é uma matriz bidimensional de caracteres
(char).
 Veja como definir esta estrutura no próximo slide.

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


Vetores de strings
 Definição de uma matriz bidimensional de caracteres (“vetor
de strings”) em pseudocódigo:
Variáveis
<nome> : matriz [<nro_strings>] [<compr_strings>] de caracteres

 Definição de uma matriz bidimensional de caracteres (“vetor


de strings”) em C:
char <nome>[<nro_strings>][<comprimento_strings>];

 Aí surge a pergunta: como acessar uma string individual?


Fácil. É só usar apenas o primeiro índice. Então, para
acessar uma determinada string faça:
nome_da_variável [índice]

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


Vetores de strings

Exemplo:
Um algoritmo que lê 5 strings e as exibe na tela.
Algoritmo SomaEMedia
Variáveis
i, : inteiro
nome : matriz[5][30] de char
Início
Para i ← 0 até 4 faça
Escreva(“Digite uma string: ”)
Leia (nome[i])
FimPara
Escreva(“As strings que voce digitou foram ”)
Para I ← 0 até 4 faça
Escreva(nome[i])
FimPara
Fim

Computação Básica – queiroz@ieee.org (c) profa. carla castanho


Vetores de strings

Exemplo:
Programa em C do algoritmo apresentado no slide anterior, que lê 5 strings e as
exibe na tela.
#include <stdio.h>
int main () {
int i;
char nome[5][30];
for (i=0; i<5; i++) {
printf ("\nDigite uma string: ");
scanf ("%s",nome[i]);
}
printf ("\nAs strings que voce digitou foram:\n\n");
for (i=0;i<5;i++)
printf ("%s\n",nome[i]);
getchar();
getchar();
return 0;
}

Computação Básica – queiroz@ieee.org (c) profa. carla castanho

You might also like