SlideShare uma empresa Scribd logo
Char e Strings de Caracteres
MAC122 – Marcilio – Atualizado em 27/08/2009

Char e Strings de Caracteres
Caracteres
Caracteres ocupam 1 byte (8 bits) na memória e são declarados com o tipo char.
Declaração:
char
char
char
char
char

a, b;
x = ‘a’;
y[12];
z[26] = {“abcdefghijklmnopqrstuvwxyz”};
w[5] = {‘a’, ‘e’, ‘i’, ‘o’, ‘u’};

Usos:
Uma variável do tipo char ocupa 1 byte (8 bits) e pode ser usada para armazenar um valor
inteiro sem sinal (unsigned char) entre 0 e 255 ou um valor com sinal (char) entre
–128 a 127. Pode ser usada como um número ou como caractere.
Exemplos:
char a, b[26];
:
:
/* uma constante do tipo caracter fica entre apóstrofes,
não entre aspas */
a = ‘.’;
/* branquear a vetor b usando a como contador */
for (a = 0; a < 20; a++) b[a] = ‘ ’;
/* colocar em b as letras maiúsculas */
/* em ASCII 65=A, 66 = B, . . . , 90 = Z */
for (a = 0; a < 26; a++) b[a] = a + 65;
/* imprimir b com formato numérico e caracter */
for (a = 0; a < 26; a++)
printf(“b[%2d] = %2d e b[%2d] = %1c”, a, b[a], a, b[a]);
Codificação ASCII (American Standard Code for Information Interchange)
Caracteres são armazenados internamente como números. Assim é necessária uma
codificação, isto é, uma associação entre um caracter e um valor numérico. Existem várias
tipos de codificação (EBCDIC, BCD, BAUDOT, etc . . .), mas a mais utilizada é o ASCII.
O ASCII é um código de 7 bits, portanto possui 128 possíveis combinações, que hoje em
dia é a codificação básica usada em informática, e que admite várias extensões,
principalmente para possibilitar a representação de caracteres especiais em várias línguas
(letras acentuadas por exemplo, alfabeto russo, japonês, etc . .). As extensões estão
Char e Strings de Caracteres
MAC122 – Marcilio
Char e Strings de Caracteres
MAC122 – Marcilio – Atualizado em 27/08/2009

associadas normalmente aos valores de 129 a 255, usando, portanto todos os 8 bits de um
byte.
O programa abaixo imprime todos os caracteres, com os correspondentes valores decimal e
hexadecimal desde 32 até 254. Antes de 32, estão alguns caracteres gráficos, bem como os
caracteres especiais que tem alguma função especial quando enviados aos dispositivos de
entrada e saida, por exemplo:
CR (13) – carriage return ( retorna para o início da linha corrente)
LF (10) – line feed (pula para a próxima linha)
FF (14) – form feed (pula para a próxima página)
BEL(07) – beep (aciona o dispositivo sonoro)
etc.
Veja um trecho da saída também abaixo.
#include <stdio.h>
/* imprime a tabela com todos os caracteres ascii
do branco (32) até o último (255) */
int main() {
unsigned char i;
for (i = 32; i < 255; i++)
printf("ndecimal = %3d * hexadecimal = %2x * caracter =
%1c",i,i,i);
}
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal
hexadecimal

Char e Strings de Caracteres
MAC122 – Marcilio

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

20
21
22
23
24
25
26
27
28
29
2a
2b
2c
2d
2e
2f
30
31
32
33
34
35
36
37
38
39
3a

*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter
caracter

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

!
"
#
$
%
&
'
(
)
*
+
,
.
/
0
1
2
3
4
5
6
7
8
9
:
Char e Strings de Caracteres
MAC122 – Marcilio – Atualizado em 27/08/2009
decimal =
decimal =
......
......
......

59 * hexadecimal = 3b * caracter = ;
60 * hexadecimal = 3c * caracter = <

Entrada e saída de caracteres
O formato %c é usado para ler ou imprimir caracteres. Na saída, se especificado um
comprimento, por exemplo, %3c, são colocados brancos à esquerda.
O programa abaixo lê um vetor de 20 caracteres e imprime os caracteres lidos intercalandoos com um branco.
include <stdio.h>
int main() {
char a[100];
int i;
for (i = 0; i < 20; i++)
scanf("%c", &a[i]);
for (i = 0; i < 20; i++)
printf("%2c", a[i]);
}

Uma outra forma é o uso das funções getchar e putchar:
int getchar () – devolve o próximo caracter digitado.
void putchar (char x) – imprime o caracter x
Veja o exemplo abaixo que também lê e imprime uma seqüência de caracteres.
#include <stdio.h>
#define fim '#'
int main() {
char c;
/* Le um conjunto de caracteres ate encontrar '#'.
Como o controle só volta ao programa após o enter, só imprime
após o enter. */
c = getchar();
while (c != fim) {
putchar(c);
c = getchar();
}
/* outra forma */
while ((c = getchar())!= fim) putchar (c);
}

Char e unsigned char

Char e Strings de Caracteres
MAC122 – Marcilio
Char e Strings de Caracteres
MAC122 – Marcilio – Atualizado em 27/08/2009

Conforme vimos nos exemplos acima, uma variável do tipo char, pode ser usada como
uma variável int ou short. A diferença é que tem apenas 8 bits enquanto que o short
tem 16 bits e int tem 32 bits.
Quando se declara char (ou short ou int), um bit é o bit de sinal na notação
complemento de 2. Se não há necessidade do sinal declara-se unsigned char (ou
unsigned short ou unsigned int).
Tipo
Char
unsigned char
Short
unsigned short
Int
unsigned int

Valores
–128 a +127
0 a 255
–215 a +215-1
0 a 216-1
–231 a +231-1
0 a 232-1

Quando usamos uma variável do tipo char para conter apenas caracteres, a configuração
do caractere armazenado pode corresponder a um número negativo. Algumas conversões
indesejáveis podem ocorrer quando se misturam char e int.
Para evitar inconsistências, é conveniente sempre usar-se unsigned char quando se usa
o valor numérico de uma variável do tipo char, por exemplo em comparações.
Cadeias de Caracteres ou Strings
A manipulação de seqüências ou cadeias de caracteres (strings) é uma operação muito
comum em processamento não numérico. Imagine os programas editores de texto que
precisam fazer operações do tipo:
- Procurar uma cadeia de caracteres no texto
- Eliminar uma cadeia do texto
- Substituir uma cadeia por outra
- Etc.
A manipulação de caracteres merece uma especial atenção das linguagens de programação
e não é diferente em C.
Cadeias de caracteres são seqüências de caracteres terminadas pelo caractere especial zero
binário, ou ‘0’. São armazenadas em vetores de caracteres.
Entrada e Saida de Cadeias de Caracters
Com o comando printf e o formato %s. Veja o exemplo abaixo:
#include <stdio.h>
int main() {
Char e Strings de Caracteres
MAC122 – Marcilio
Char e Strings de Caracteres
MAC122 – Marcilio – Atualizado em 27/08/2009
char a[100];
/* le todos os caracteres digitados e coloca em a
insere um 0 no final */
scanf("%s", a);
/* imprime todos os caracteres até o '0' */
printf("%s", a);
}

Com as funções gets e puts:
char *gets(char *s); - Lê os caracteres digitados e os coloca no vetor s até que
seja digitado <enter>. O <enter> é descartado e é inserido um 0 no final.
int puts(const char *s); - Imprime os caracteres do vetor s até encontrar um
0. Adiciona um caractere n no final, ou seja muda de linha.
Veja o exemplo abaixo:
#include <stdio.h>
int main() {
char a[100];
/* le e imprime um string */
gets (a);
puts (a);
}

Algumas funções usando strings
/* move string a para b */
void move ( char a[], char b[]) {
int i = 0;
while (a[i] != ‘0’) {b[i] = a[i]; i++}
b[i] = a[i];
}
/* devolve o tamanho do string a */
int tamanho (char a[]) {
int i = 0;
while (a[i] != ‘0’) i++;
return i
}
/* idem a move usando a função tamanho */
void move ( char a[], char b[]) {
int i, k;
k = tamanho (a);
for (i = 0; i <= k; i++) b[i] = a[i];
}
/* outra versão da move */
void copia (char s[],char t[]) {
int i=0;
Char e Strings de Caracteres
MAC122 – Marcilio
Char e Strings de Caracteres
MAC122 – Marcilio – Atualizado em 27/08/2009
while((s[i]=t[i])!='0') i++;
}
/* concatena 2 strings */
void concatena (char s[], char t[]) {
int i=0,j=0;
while (s[i]!='0')i++;
while((s[i++]=t[j++])!= '0');
}

Comparação de strings:
A comparação entre dois strings é feita, levando em conta a codificação ASCII de cada
caractere. Lembre-se que a codificação ASCII leva em conta a ordem alfabética, isto é,
‘a’< ‘b’< ‘c’< . . . ‘z’. Assim:
“maria da silva” > “maria da selva”
“xico” > “francisco” (neste caso os comprimentos são diferentes)
“maria” < “mariana” (tamanhos diferentes – o de maior comprimento é o maior)
“antonio dos santos” < “antonio santos”
/* compara dois strings a e b e devolve 0 se a=b, 1 se a>b e –1 se a<b */
int compara (unsigned char a[], unsigned char b[]) {
int i, k;
k = tamanho (a);
for (i = 0; i < k+1; i++)
if (a[i] != b[i])
if (a[i] > b[i]) return 1;
else return –1;
/* se chegou aqui é porque todos eram iguais inclusive o (k+1)-ésimo
que é o zero binário (fim do string)
note que isto é verdade mesmo se tamanho(a) diferente do tamanho(b)
*/
return 0;
}
/* idem, outra solução */
int compara (unsigned char a[], unsigned char b[]) {
int i = 0;
while (a[i] != 0 && b[i] != 0)
if (a[i] != b[i])
if (a[i] > b[i]) return 1;
else return –1;
/* Se chegou aqui é porque chegamos ao final de um dos strings
(ou os dois)
Em qualquer caso o i-esimo caracter decide se a==b, a>b ou a<b
*/
if (a[i] == b[i]) return 0;
else if (a[i] > b[i]) return 1;
else return –1;
}

Char e Strings de Caracteres
MAC122 – Marcilio
Char e Strings de Caracteres
MAC122 – Marcilio – Atualizado em 27/08/2009
/* idem devolvendo 0 se a=b, valor>0 se a>b e valor<0 se a<b */
int compara (unsigned char a[], unsigned char b[]) {
int i = 0;
while (a[i] == b[i])
if (a[i] == ‘0’) return 0;
else i++;
/* se chegou aqui é porque são diferentes */
return a[i] – b [i];
}

Outra solução para a comparação:
int comparar (unsigned char s[], unsigned char t[]) {
int i;
for(i=0;s[i]==t[i];i++) if(s[i]=='0') return 0;
return s[i]-t[i];
}

Letras maiúsculas, minúsculas e vogais acentuadas
Como as letras maiúsculas são menores que as minúsculas, quando estas são misturadas
numa string, a comparação fica confusa. Por exemplo:
“antonio” > “Antonio” e “antonio”

> “anTonio”

Uma solução normalmente usada para evitar esse tipo de confusão é transformar todas as
letras para maiúsculas antes de fazer a comparação.
/* transforma as minúsculas em maiúsculas da string a */
void tudo_maiuscula(char a[]) {
int i = 0;
while (a[i] != 0 )
/* verifica se a[i] é minúscula */
if (a[i] >= ‘a’ && a[i] <= ‘z’)
/* transforma em maiúscula */
a[i] = a[i] – ‘a’ + ‘A’;
}

Agora vamos refazer a compara usando a tudo_maiuscula:
int novacompara (char a[], char b[]) {
int i = 0;
/* transforma a e b */
tudo_maiuscula(a);
tudo_maiuscula(b);
/* retorna o mesmo que compara (a, b) */
return compara(a, b);
}

Um outro problema na comparação alfabética ocorre com as vogais acentuadas: á, ã, â, é, ê,
í, ó, õ, ô, ú.
Cada uma delas tem o seu código numérico correspondente e a comparação pode ficar
confusa.
Char e Strings de Caracteres
MAC122 – Marcilio
Char e Strings de Caracteres
MAC122 – Marcilio – Atualizado em 27/08/2009

A melhor solução para uma comparação alfabética mais limpa e completa é:
1 - Trocar todas as vogais acentuadas pelas não acentuadas;
2 - Transformar para maiúsculas (ou minúsculas);
3 - Comparar.
Exercícios
P79) Escreva uma função compacta (char a[], char b[]) que recebe o string a
e devolve o string b eliminando os brancos de a.
P80) Idem compacta (char a[]) que devolve no próprio a. Faça sem usar vetores
auxiliares, isto é, o algoritmo deve eliminar os brancos movendo os caracteres para novas
posições do próprio a.
P81) Idem compacta (char a[]), substituindo cadeias de mais de um branco, por um
só branco.
P82) Escreva a função int contapal (char a[]), que devolve como resultado o
número de palavras do string a. Uma palavra é uma seqüência de caracteres não brancos,
precedida e seguida por brancos.
P82a) Escreva a função int substring (char a[], char b[]), que verifica se
o string a é sub-string de b devolvendo 1 (sim) ou 0 (não)
Funções pré-definidas com strings
Existem várias funções pré-definidas que mexem com cadeias de caracteres. Para usá-las é
necessário um #include <string.h>. Veja algumas abaixo:
char *strcpy(s, r) – copia string r para a cadeia s. Devolve ponteiro para s.
char *strncpy(s, r, n) – copia no máximo n caracteres de r para s. Retorna
ponteiro para s. Se r tiver menos que n caracteres preenche s com ‘0’s.
char *strcat(s, r) – concatena cadeia r no final da cadeia s. Retorna ponteiro
para s.
char *strncat(s, r, n) – concatena no máximo n caracteres da cadeia r para a
cadeia s. Termina s com ‘0’. Retorna ponteiro para s.
int strcmp(s, r) – compara a cadeia s com a cadeia r. Retorna < 0 se s < r, 0 se s
= r e > 0 se s > r.

Char e Strings de Caracteres
MAC122 – Marcilio
Char e Strings de Caracteres
MAC122 – Marcilio – Atualizado em 27/08/2009

int strncmp(s, r, n) – compara no máximo n caracteres da cadeia s com a
cadeia r. Retorna < 0 se s < r, 0 se s = r e > 0 se s > r.
char *strchr(s, c) – retorna ponteiro para a primeira ocorrência do caractere c na
cadeia s ou NULL se não estiver presente.
char *strrchr(s, c) – retorna ponteiro para a última ocorrência do caractere c na
cadeia s ou NULL se não estiver presente.
int strspn(s, r) – retorna tamanho do maior prefixo em s que coincide com r.
int strcspn(s, r) – retorna tamanho do maior prefixo em s que não coincide com
r.
char *strpbrk(s, r) – retorna ponteiro para a primeira ocorrência na cadeia s de
qualquer caractere na cadeia r, ou NULL se não achar.
char *strstr(s, r) – retorna ponteiro para a primeira ocorrência da cadeia r na
cadeia s, ou NULL se não achar.
int strlen(cs) – retorna tamanho de s.
Embora pré-definidas, as funções acima tem uma implementação simples. Por exemplo:
strlen(s) é a função tamanho(s) definida acima.
strncmp(s,r,n) é a função compara(s,r,n) definida acima.
strcpy(s,r) é a função move(s,r) definida acima.
Assim quando se usa tais funções deve-se levar isso em conta se existe preocupação com a
eficiência dos algoritmos. No exemplo abaixo que conta o número de brancos de uma
string:
c = 0;
for (i=0;i<strlen(a);i++)
if (a[i] == ’ ’) c++;
Melhor seria:
c = 0;
k = strlen(a);
for (i=0;i<k;i++)
if (a[i] == ’ ’) c++;
Funções de comparação de caracteres

Char e Strings de Caracteres
MAC122 – Marcilio
Char e Strings de Caracteres
MAC122 – Marcilio – Atualizado em 27/08/2009

O argumento das funções abaixo é sempre um int. Portanto podemos passar um char como
parâmetro. As funções devolvem um valor diferente de zero se forem verdadeiras, ou zero
se forem falsas.
isupper (c) – se c é letra maiúscula.
islower (c) – se c é letra minúscula.
isalpha (c) – equivalente a isupper ( c ) || islower ( c )
isdigit (c) – caractere entre “’0’e ‘9’.
isalnum (c) – equivalente a isalpha ( c )
isspace (c) – se c é igual a branco.

Char e Strings de Caracteres
MAC122 – Marcilio

|| isdigit ( c )
Char e Strings de Caracteres
MAC122 – Marcilio – Atualizado em 27/08/2009

Tabela de códigos ASCII

Tabela extendida de códigos ASCII

Char e Strings de Caracteres
MAC122 – Marcilio

Mais conteúdo relacionado

PDF
Aula04 ponteiros e conversao
PDF
python.tipos
PDF
Programando em python tipos basicos
PDF
Ponteiros e Alocação Dinâmica
PDF
Henriquecristovao manual c-cpp
PDF
Office 2003
PDF
Apostila da linguagem c
Aula04 ponteiros e conversao
python.tipos
Programando em python tipos basicos
Ponteiros e Alocação Dinâmica
Henriquecristovao manual c-cpp
Office 2003
Apostila da linguagem c

Mais procurados (18)

PDF
Unidade7 1
PDF
Referência da linguagem de programação arduino multilógica shop
PDF
Questesdetecnologia ano2003
PDF
Java 05
PDF
Haskell aula2 tipos-e-classes
PPTX
Aula 05 Vetores
PDF
Lista de exercício resposta
PPTX
Estrutura de dados em Java - Ponteiros e Alocação de Memória
PPT
Lógica De Programação
PPTX
Fundamentos de C#
PDF
Apostila da linguagem c
PDF
53297189 apostila-algoritmo-e-logica-i
ODP
Java 03 Tipos Dados Operadores
PDF
Introdução ao c++
PPT
Exercicios Php
PDF
Compiladores 7
PDF
Linguagem C (Parte 5)
Unidade7 1
Referência da linguagem de programação arduino multilógica shop
Questesdetecnologia ano2003
Java 05
Haskell aula2 tipos-e-classes
Aula 05 Vetores
Lista de exercício resposta
Estrutura de dados em Java - Ponteiros e Alocação de Memória
Lógica De Programação
Fundamentos de C#
Apostila da linguagem c
53297189 apostila-algoritmo-e-logica-i
Java 03 Tipos Dados Operadores
Introdução ao c++
Exercicios Php
Compiladores 7
Linguagem C (Parte 5)
Anúncio

Semelhante a 4 char e strings (20)

PDF
unidade04-c3-handout.pdf
PDF
Vetores, Matrizes e Strings em C Parte 3
PPTX
Linguagem C - Strings
PPTX
Linguagem em c
DOCX
Biblioteca strings profª ms
PDF
Linguagem c wellington telles - aula 03
PDF
PDF
PDF
Comandos de Controle de Programa em C
PDF
Algoritmos e Programação: Manipulação de strings
PPTX
programação c 10 aula
PPT
aula de algoritmos - vetores de programação matrizes
PDF
Minicurso Java && Cl
ODP
Linguagem C 02 String
PDF
Variáveis inteiros ou int com python
PDF
Algoritmos e LP - Aula 08 - Linguagem C - p1.pdf
PPTX
Linguagem C - Entrada e Saída
PDF
C++ basico
PDF
C ou c++
PDF
Aula01 introducao operacoes
unidade04-c3-handout.pdf
Vetores, Matrizes e Strings em C Parte 3
Linguagem C - Strings
Linguagem em c
Biblioteca strings profª ms
Linguagem c wellington telles - aula 03
Comandos de Controle de Programa em C
Algoritmos e Programação: Manipulação de strings
programação c 10 aula
aula de algoritmos - vetores de programação matrizes
Minicurso Java && Cl
Linguagem C 02 String
Variáveis inteiros ou int com python
Algoritmos e LP - Aula 08 - Linguagem C - p1.pdf
Linguagem C - Entrada e Saída
C++ basico
C ou c++
Aula01 introducao operacoes
Anúncio

Mais de Ricardo Bolanho (20)

PDF
19 algoritmos de enumeracao
PDF
18 algoritmos de busca de palavras em texto
PDF
17 arvores binarias de busca
PDF
16 algoritmos de busca em tabelas - hash
PDF
15 algoritmos de busca em tabelas - sequencial e binaria
PDF
14 algoritmos de classificacao de tabelas
PDF
13 introducao a analise de algoritmos
PDF
12 algoritmos e funcoes recursivas
PDF
11 tipos abstratos de dados
PDF
10 alocacao dinamica - listas ligadas
PDF
9 structs e ponteiros
PDF
8 ponteiros, ponteiros e vetores e alocacao dinamica de memoria
PDF
7 alocacao sequencial - filas
PDF
6 alocacao sequencial - pilhas
PDF
5 expressoes logicas - operadores - base binaria - operadores de bits
PDF
3 funcoes vetores matrizes
PDF
2 funcoes e estrutura de blocos
PDF
Lógica para computação silva-finger-melo
DOCX
Projeto 2 aula 5
DOCX
Projeto 1 aula 4
19 algoritmos de enumeracao
18 algoritmos de busca de palavras em texto
17 arvores binarias de busca
16 algoritmos de busca em tabelas - hash
15 algoritmos de busca em tabelas - sequencial e binaria
14 algoritmos de classificacao de tabelas
13 introducao a analise de algoritmos
12 algoritmos e funcoes recursivas
11 tipos abstratos de dados
10 alocacao dinamica - listas ligadas
9 structs e ponteiros
8 ponteiros, ponteiros e vetores e alocacao dinamica de memoria
7 alocacao sequencial - filas
6 alocacao sequencial - pilhas
5 expressoes logicas - operadores - base binaria - operadores de bits
3 funcoes vetores matrizes
2 funcoes e estrutura de blocos
Lógica para computação silva-finger-melo
Projeto 2 aula 5
Projeto 1 aula 4

Último (11)

PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PPTX
Arquitetura de computadores - Memórias Secundárias
PPTX
Mecânico de Manutenção de Equipamentos.pptx
PDF
Manejo integrado de pragas na cultura do algodão
PDF
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
PPTX
Eng. Software - pontos essenciais para o início
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PPTX
Viasol Energia Solar -Soluções para geração e economia de energia
PPTX
Utilizando code blockes por andre backes
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Arquitetura de computadores - Memórias Secundárias
Mecânico de Manutenção de Equipamentos.pptx
Manejo integrado de pragas na cultura do algodão
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
Eng. Software - pontos essenciais para o início
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Viasol Energia Solar -Soluções para geração e economia de energia
Utilizando code blockes por andre backes

4 char e strings

  • 1. Char e Strings de Caracteres MAC122 – Marcilio – Atualizado em 27/08/2009 Char e Strings de Caracteres Caracteres Caracteres ocupam 1 byte (8 bits) na memória e são declarados com o tipo char. Declaração: char char char char char a, b; x = ‘a’; y[12]; z[26] = {“abcdefghijklmnopqrstuvwxyz”}; w[5] = {‘a’, ‘e’, ‘i’, ‘o’, ‘u’}; Usos: Uma variável do tipo char ocupa 1 byte (8 bits) e pode ser usada para armazenar um valor inteiro sem sinal (unsigned char) entre 0 e 255 ou um valor com sinal (char) entre –128 a 127. Pode ser usada como um número ou como caractere. Exemplos: char a, b[26]; : : /* uma constante do tipo caracter fica entre apóstrofes, não entre aspas */ a = ‘.’; /* branquear a vetor b usando a como contador */ for (a = 0; a < 20; a++) b[a] = ‘ ’; /* colocar em b as letras maiúsculas */ /* em ASCII 65=A, 66 = B, . . . , 90 = Z */ for (a = 0; a < 26; a++) b[a] = a + 65; /* imprimir b com formato numérico e caracter */ for (a = 0; a < 26; a++) printf(“b[%2d] = %2d e b[%2d] = %1c”, a, b[a], a, b[a]); Codificação ASCII (American Standard Code for Information Interchange) Caracteres são armazenados internamente como números. Assim é necessária uma codificação, isto é, uma associação entre um caracter e um valor numérico. Existem várias tipos de codificação (EBCDIC, BCD, BAUDOT, etc . . .), mas a mais utilizada é o ASCII. O ASCII é um código de 7 bits, portanto possui 128 possíveis combinações, que hoje em dia é a codificação básica usada em informática, e que admite várias extensões, principalmente para possibilitar a representação de caracteres especiais em várias línguas (letras acentuadas por exemplo, alfabeto russo, japonês, etc . .). As extensões estão Char e Strings de Caracteres MAC122 – Marcilio
  • 2. Char e Strings de Caracteres MAC122 – Marcilio – Atualizado em 27/08/2009 associadas normalmente aos valores de 129 a 255, usando, portanto todos os 8 bits de um byte. O programa abaixo imprime todos os caracteres, com os correspondentes valores decimal e hexadecimal desde 32 até 254. Antes de 32, estão alguns caracteres gráficos, bem como os caracteres especiais que tem alguma função especial quando enviados aos dispositivos de entrada e saida, por exemplo: CR (13) – carriage return ( retorna para o início da linha corrente) LF (10) – line feed (pula para a próxima linha) FF (14) – form feed (pula para a próxima página) BEL(07) – beep (aciona o dispositivo sonoro) etc. Veja um trecho da saída também abaixo. #include <stdio.h> /* imprime a tabela com todos os caracteres ascii do branco (32) até o último (255) */ int main() { unsigned char i; for (i = 32; i < 255; i++) printf("ndecimal = %3d * hexadecimal = %2x * caracter = %1c",i,i,i); } decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal decimal = = = = = = = = = = = = = = = = = = = = = = = = = = = 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 * * * * * * * * * * * * * * * * * * * * * * * * * * * hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal hexadecimal Char e Strings de Caracteres MAC122 – Marcilio = = = = = = = = = = = = = = = = = = = = = = = = = = = 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a * * * * * * * * * * * * * * * * * * * * * * * * * * * caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter caracter = = = = = = = = = = = = = = = = = = = = = = = = = = = ! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 :
  • 3. Char e Strings de Caracteres MAC122 – Marcilio – Atualizado em 27/08/2009 decimal = decimal = ...... ...... ...... 59 * hexadecimal = 3b * caracter = ; 60 * hexadecimal = 3c * caracter = < Entrada e saída de caracteres O formato %c é usado para ler ou imprimir caracteres. Na saída, se especificado um comprimento, por exemplo, %3c, são colocados brancos à esquerda. O programa abaixo lê um vetor de 20 caracteres e imprime os caracteres lidos intercalandoos com um branco. include <stdio.h> int main() { char a[100]; int i; for (i = 0; i < 20; i++) scanf("%c", &a[i]); for (i = 0; i < 20; i++) printf("%2c", a[i]); } Uma outra forma é o uso das funções getchar e putchar: int getchar () – devolve o próximo caracter digitado. void putchar (char x) – imprime o caracter x Veja o exemplo abaixo que também lê e imprime uma seqüência de caracteres. #include <stdio.h> #define fim '#' int main() { char c; /* Le um conjunto de caracteres ate encontrar '#'. Como o controle só volta ao programa após o enter, só imprime após o enter. */ c = getchar(); while (c != fim) { putchar(c); c = getchar(); } /* outra forma */ while ((c = getchar())!= fim) putchar (c); } Char e unsigned char Char e Strings de Caracteres MAC122 – Marcilio
  • 4. Char e Strings de Caracteres MAC122 – Marcilio – Atualizado em 27/08/2009 Conforme vimos nos exemplos acima, uma variável do tipo char, pode ser usada como uma variável int ou short. A diferença é que tem apenas 8 bits enquanto que o short tem 16 bits e int tem 32 bits. Quando se declara char (ou short ou int), um bit é o bit de sinal na notação complemento de 2. Se não há necessidade do sinal declara-se unsigned char (ou unsigned short ou unsigned int). Tipo Char unsigned char Short unsigned short Int unsigned int Valores –128 a +127 0 a 255 –215 a +215-1 0 a 216-1 –231 a +231-1 0 a 232-1 Quando usamos uma variável do tipo char para conter apenas caracteres, a configuração do caractere armazenado pode corresponder a um número negativo. Algumas conversões indesejáveis podem ocorrer quando se misturam char e int. Para evitar inconsistências, é conveniente sempre usar-se unsigned char quando se usa o valor numérico de uma variável do tipo char, por exemplo em comparações. Cadeias de Caracteres ou Strings A manipulação de seqüências ou cadeias de caracteres (strings) é uma operação muito comum em processamento não numérico. Imagine os programas editores de texto que precisam fazer operações do tipo: - Procurar uma cadeia de caracteres no texto - Eliminar uma cadeia do texto - Substituir uma cadeia por outra - Etc. A manipulação de caracteres merece uma especial atenção das linguagens de programação e não é diferente em C. Cadeias de caracteres são seqüências de caracteres terminadas pelo caractere especial zero binário, ou ‘0’. São armazenadas em vetores de caracteres. Entrada e Saida de Cadeias de Caracters Com o comando printf e o formato %s. Veja o exemplo abaixo: #include <stdio.h> int main() { Char e Strings de Caracteres MAC122 – Marcilio
  • 5. Char e Strings de Caracteres MAC122 – Marcilio – Atualizado em 27/08/2009 char a[100]; /* le todos os caracteres digitados e coloca em a insere um 0 no final */ scanf("%s", a); /* imprime todos os caracteres até o '0' */ printf("%s", a); } Com as funções gets e puts: char *gets(char *s); - Lê os caracteres digitados e os coloca no vetor s até que seja digitado <enter>. O <enter> é descartado e é inserido um 0 no final. int puts(const char *s); - Imprime os caracteres do vetor s até encontrar um 0. Adiciona um caractere n no final, ou seja muda de linha. Veja o exemplo abaixo: #include <stdio.h> int main() { char a[100]; /* le e imprime um string */ gets (a); puts (a); } Algumas funções usando strings /* move string a para b */ void move ( char a[], char b[]) { int i = 0; while (a[i] != ‘0’) {b[i] = a[i]; i++} b[i] = a[i]; } /* devolve o tamanho do string a */ int tamanho (char a[]) { int i = 0; while (a[i] != ‘0’) i++; return i } /* idem a move usando a função tamanho */ void move ( char a[], char b[]) { int i, k; k = tamanho (a); for (i = 0; i <= k; i++) b[i] = a[i]; } /* outra versão da move */ void copia (char s[],char t[]) { int i=0; Char e Strings de Caracteres MAC122 – Marcilio
  • 6. Char e Strings de Caracteres MAC122 – Marcilio – Atualizado em 27/08/2009 while((s[i]=t[i])!='0') i++; } /* concatena 2 strings */ void concatena (char s[], char t[]) { int i=0,j=0; while (s[i]!='0')i++; while((s[i++]=t[j++])!= '0'); } Comparação de strings: A comparação entre dois strings é feita, levando em conta a codificação ASCII de cada caractere. Lembre-se que a codificação ASCII leva em conta a ordem alfabética, isto é, ‘a’< ‘b’< ‘c’< . . . ‘z’. Assim: “maria da silva” > “maria da selva” “xico” > “francisco” (neste caso os comprimentos são diferentes) “maria” < “mariana” (tamanhos diferentes – o de maior comprimento é o maior) “antonio dos santos” < “antonio santos” /* compara dois strings a e b e devolve 0 se a=b, 1 se a>b e –1 se a<b */ int compara (unsigned char a[], unsigned char b[]) { int i, k; k = tamanho (a); for (i = 0; i < k+1; i++) if (a[i] != b[i]) if (a[i] > b[i]) return 1; else return –1; /* se chegou aqui é porque todos eram iguais inclusive o (k+1)-ésimo que é o zero binário (fim do string) note que isto é verdade mesmo se tamanho(a) diferente do tamanho(b) */ return 0; } /* idem, outra solução */ int compara (unsigned char a[], unsigned char b[]) { int i = 0; while (a[i] != 0 && b[i] != 0) if (a[i] != b[i]) if (a[i] > b[i]) return 1; else return –1; /* Se chegou aqui é porque chegamos ao final de um dos strings (ou os dois) Em qualquer caso o i-esimo caracter decide se a==b, a>b ou a<b */ if (a[i] == b[i]) return 0; else if (a[i] > b[i]) return 1; else return –1; } Char e Strings de Caracteres MAC122 – Marcilio
  • 7. Char e Strings de Caracteres MAC122 – Marcilio – Atualizado em 27/08/2009 /* idem devolvendo 0 se a=b, valor>0 se a>b e valor<0 se a<b */ int compara (unsigned char a[], unsigned char b[]) { int i = 0; while (a[i] == b[i]) if (a[i] == ‘0’) return 0; else i++; /* se chegou aqui é porque são diferentes */ return a[i] – b [i]; } Outra solução para a comparação: int comparar (unsigned char s[], unsigned char t[]) { int i; for(i=0;s[i]==t[i];i++) if(s[i]=='0') return 0; return s[i]-t[i]; } Letras maiúsculas, minúsculas e vogais acentuadas Como as letras maiúsculas são menores que as minúsculas, quando estas são misturadas numa string, a comparação fica confusa. Por exemplo: “antonio” > “Antonio” e “antonio” > “anTonio” Uma solução normalmente usada para evitar esse tipo de confusão é transformar todas as letras para maiúsculas antes de fazer a comparação. /* transforma as minúsculas em maiúsculas da string a */ void tudo_maiuscula(char a[]) { int i = 0; while (a[i] != 0 ) /* verifica se a[i] é minúscula */ if (a[i] >= ‘a’ && a[i] <= ‘z’) /* transforma em maiúscula */ a[i] = a[i] – ‘a’ + ‘A’; } Agora vamos refazer a compara usando a tudo_maiuscula: int novacompara (char a[], char b[]) { int i = 0; /* transforma a e b */ tudo_maiuscula(a); tudo_maiuscula(b); /* retorna o mesmo que compara (a, b) */ return compara(a, b); } Um outro problema na comparação alfabética ocorre com as vogais acentuadas: á, ã, â, é, ê, í, ó, õ, ô, ú. Cada uma delas tem o seu código numérico correspondente e a comparação pode ficar confusa. Char e Strings de Caracteres MAC122 – Marcilio
  • 8. Char e Strings de Caracteres MAC122 – Marcilio – Atualizado em 27/08/2009 A melhor solução para uma comparação alfabética mais limpa e completa é: 1 - Trocar todas as vogais acentuadas pelas não acentuadas; 2 - Transformar para maiúsculas (ou minúsculas); 3 - Comparar. Exercícios P79) Escreva uma função compacta (char a[], char b[]) que recebe o string a e devolve o string b eliminando os brancos de a. P80) Idem compacta (char a[]) que devolve no próprio a. Faça sem usar vetores auxiliares, isto é, o algoritmo deve eliminar os brancos movendo os caracteres para novas posições do próprio a. P81) Idem compacta (char a[]), substituindo cadeias de mais de um branco, por um só branco. P82) Escreva a função int contapal (char a[]), que devolve como resultado o número de palavras do string a. Uma palavra é uma seqüência de caracteres não brancos, precedida e seguida por brancos. P82a) Escreva a função int substring (char a[], char b[]), que verifica se o string a é sub-string de b devolvendo 1 (sim) ou 0 (não) Funções pré-definidas com strings Existem várias funções pré-definidas que mexem com cadeias de caracteres. Para usá-las é necessário um #include <string.h>. Veja algumas abaixo: char *strcpy(s, r) – copia string r para a cadeia s. Devolve ponteiro para s. char *strncpy(s, r, n) – copia no máximo n caracteres de r para s. Retorna ponteiro para s. Se r tiver menos que n caracteres preenche s com ‘0’s. char *strcat(s, r) – concatena cadeia r no final da cadeia s. Retorna ponteiro para s. char *strncat(s, r, n) – concatena no máximo n caracteres da cadeia r para a cadeia s. Termina s com ‘0’. Retorna ponteiro para s. int strcmp(s, r) – compara a cadeia s com a cadeia r. Retorna < 0 se s < r, 0 se s = r e > 0 se s > r. Char e Strings de Caracteres MAC122 – Marcilio
  • 9. Char e Strings de Caracteres MAC122 – Marcilio – Atualizado em 27/08/2009 int strncmp(s, r, n) – compara no máximo n caracteres da cadeia s com a cadeia r. Retorna < 0 se s < r, 0 se s = r e > 0 se s > r. char *strchr(s, c) – retorna ponteiro para a primeira ocorrência do caractere c na cadeia s ou NULL se não estiver presente. char *strrchr(s, c) – retorna ponteiro para a última ocorrência do caractere c na cadeia s ou NULL se não estiver presente. int strspn(s, r) – retorna tamanho do maior prefixo em s que coincide com r. int strcspn(s, r) – retorna tamanho do maior prefixo em s que não coincide com r. char *strpbrk(s, r) – retorna ponteiro para a primeira ocorrência na cadeia s de qualquer caractere na cadeia r, ou NULL se não achar. char *strstr(s, r) – retorna ponteiro para a primeira ocorrência da cadeia r na cadeia s, ou NULL se não achar. int strlen(cs) – retorna tamanho de s. Embora pré-definidas, as funções acima tem uma implementação simples. Por exemplo: strlen(s) é a função tamanho(s) definida acima. strncmp(s,r,n) é a função compara(s,r,n) definida acima. strcpy(s,r) é a função move(s,r) definida acima. Assim quando se usa tais funções deve-se levar isso em conta se existe preocupação com a eficiência dos algoritmos. No exemplo abaixo que conta o número de brancos de uma string: c = 0; for (i=0;i<strlen(a);i++) if (a[i] == ’ ’) c++; Melhor seria: c = 0; k = strlen(a); for (i=0;i<k;i++) if (a[i] == ’ ’) c++; Funções de comparação de caracteres Char e Strings de Caracteres MAC122 – Marcilio
  • 10. Char e Strings de Caracteres MAC122 – Marcilio – Atualizado em 27/08/2009 O argumento das funções abaixo é sempre um int. Portanto podemos passar um char como parâmetro. As funções devolvem um valor diferente de zero se forem verdadeiras, ou zero se forem falsas. isupper (c) – se c é letra maiúscula. islower (c) – se c é letra minúscula. isalpha (c) – equivalente a isupper ( c ) || islower ( c ) isdigit (c) – caractere entre “’0’e ‘9’. isalnum (c) – equivalente a isalpha ( c ) isspace (c) – se c é igual a branco. Char e Strings de Caracteres MAC122 – Marcilio || isdigit ( c )
  • 11. Char e Strings de Caracteres MAC122 – Marcilio – Atualizado em 27/08/2009 Tabela de códigos ASCII Tabela extendida de códigos ASCII Char e Strings de Caracteres MAC122 – Marcilio