Escolar Documentos
Profissional Documentos
Cultura Documentos
(Strings)
Strings)
Um caractere é considerado um tipo de
Nesta aula veremos a dado primitivo na maioria dos computadores
estrutura de dados Um tipo de dado é primitivo se o computador
homogênea cadeia de
possui instruções em linguagem de máquina
caracteres
que permitem a manipulação deste tipo
Essa estrutura pode
parecer similar a um vetor Desde que uma cadeia é uma seqüência
de caracteres mas veremos ordenada de caracteres, o caractere é a
que ela possui um entidade fundamental de manipulação de
tratamento diferenciado uma cadeia
José Augusto Baranauskas E-mail: augusto@ffclrp.usp.br
Departamento de Física e Matemática – FFCLRP-USP URL: http://fmrp.usp.br/augusto
Sala 228 – Bloco P2 – Fone (16) 602-4439
2
1
ASCII & EBCDIC ASCII & EBCDIC
dec hex binary ASCII EBCDIC dec hex binary ASCII EBCDIC
0 0x00 0000 0000 NUL Null NUL Null 40 0x28 0010 1000 ( Left Parenthesis
1 0x01 0000 0001 SOH Start of Heading (CC) SOH Start of Heading 41 0x29 0010 1001 ) Right Parenthesis
2 0x02 0000 0010 STX Start of Text (CC) STX Start of Text 42 0x2A 0010 1010 * Asterisk, "star" SM Set Mode
3 0x03 0000 0011 ETX End of Text (CC) ETX End of Text 43 0x2B 0010 1011 + Plus Sign CU2 Customer Use 2
4 0x04 0000 0100 EOT End of Transmission (CC) PF Punch Off 44 0x2C 0010 1100 , Comma
5 0x05 0000 0101 ENQ Enquiry (CC) HT Horizontal Tab 45 0x2D 0010 1101 - Hyphen, Minus Sign ENQ Enquiry
6 0x06 0000 0110 ACK Acknowledge (CC) LC Lower Case 46 0x2E 0010 1110 . Period, Decimal Point, "dot" ACK Acknowledge
7 0x07 0000 0111 BEL Bell DEL Delete 47 0x2F 0010 1111 / Slash, Virgule BEL Bell
8 0x08 0000 1000 BS Backspace (FE) 48 0x30 0011 0000 0 0
9 0x09 0000 1001 HT Horizontal Tabulation (FE) 49 0x31 0011 0001 1 1
10 0x0A 0000 1010 LF Line Feed (FE) SMM Start of Manual Message 50 0x32 0011 0010 2 2 SYN Synchronous Idle
11 0x0B 0000 1011 VT Vertical Tabulation (FE) VT Vertical Tab 51 0x33 0011 0011 3 3
12 0x0C 0000 1100 FF Form Feed (FE) FF Form Feed 52 0x34 0011 0100 4 4 PN Punch On
13 0x0D 0000 1101 CR Carriage Return (FE) CR Carriage Return 53 0x35 0011 0101 5 5 RS Reader Stop
14 0x0E 0000 1110 SO Shift Out SO Shift Out 54 0x36 0011 0110 6 6 UC Upper Case
15 0x0F 0000 1111 SI Shift In SI Shift In 55 0x37 0011 0111 7 7 EOT End of Transmission
16 0x10 0001 0000 DLE Data Link Escape (CC) DLE Data Link Escape 56 0x38 0011 1000 8 8
17 0x11 0001 0001 DC1 Device Control 1 DC1 Device Control 1 57 0x39 0011 1001 9 9
18 0x12 0001 0010 DC2 Device Control 2 DC2 Device Control 2 58 0x3A 0011 1010 : Colon
19 0x13 0001 0011 DC3 Device Control 3 TM Tape Mark 59 0x3B 0011 1011 ; Semicolon CU3 Customer Use 3
20 0x14 0001 0100 DC4 Device Control 4 RES Restore 60 0x3C 0011 1100 < Less-than Sign DC4 Device Control 4
21 0x15 0001 0101 NAK Negative Acknowledge (CC) NL New Line 61 0x3D 0011 1101 = Equal Sign NAK Negative Acknowledge
22 0x16 0001 0110 SYN Synchronous Idle (CC) BS Backspace 62 0x3E 0011 1110 > Greater-than Sign
23 0x17 0001 0111 ETB End of Transmission Block (CC) IL Idle 63 0x3F 0011 1111 ? Question Mark SUB Substitute
24 0x18 0001 1000 CAN Cancel CAN Cancel 64 0x40 0100 0000 @ At Sign SP Space
25 0x19 0001 1001 EM End of Medium EM End of Medium 65 0x41 0100 0001 A A
26 0x1A 0001 1010 SUB Substitute CC Cursor Control 66 0x42 0100 0010 B B
67 0x43 0100 0011 C C
27 0x1B 0001 1011 ESC Escape CU1 Customer Use 1
7 8
9 10
11 12
2
ASCII & EBCDIC Codificação de Caracteres
Vamos analisar a representação de caracteres utilizando a
codificação ASCII
dec hex
240 0xF0
binary
1111 0000
ASCII EBCDIC
0 0
A representação do caractere ’a’ é a seqüência de bits:
241 0xF1
242 0xF2
1111 0001
1111 0010
1
2
1
2
0110 0001 0 1 1 0 0 0 0 1
243 0xF3 1111 0011 3 3
244 0xF4
245 0xF5
1111 0100
1111 0101
4
5
4
5 27 26 25 24 23 22 21 20
246 0xF6 1111 0110 6 6
247 0xF7 1111 0111 7 7
248 0xF8
249 0xF9
1111 1000
1111 1001
8
9
8
9
onde o peso de cada dígito binário é dado abaixo daquele
250 0xFA
251 0xFB
1111 1010
1111 1011
dígito
252 0xFC 1111 1100
253 0xFD 1111 1101 O valor decimal equivalente da representação para o
254 0xFE 1111 1110
255 0xFF 1111 1111 caractere ’a’ é
0 × 2 7 + 1 × 2 6 + 1 × 2 5 + 0 × 2 4 + 0 × 2 3 + 0 × 2 2 + 0 × 21 + 1 × 2 0
= 64 + 32 + 1 = 97
13 14
3
Conceitos e Terminologia de Cadeias Concatenação
Uma cadeia de caracteres é uma seqüência A operação de concatenação une duas cadeias de
ordenada de caracteres, cada um dos quais caracteres formando uma só
pertence a um alfabeto
Por exemplo, usando o alfabeto {’X’,’Y’,’Z’} podemos Geralmente é indicada pelo operador +
construir cadeias tais como ”X”, ”XY”, ”XXYYZ” e ”ZYX”
Por exemplo, se temos duas cadeias ”Mona” e
Uma cadeia pode não conter caracteres
”lisa”, o resultado da operação ”Mona”+”lisa” é a
É indicada por ””
Denominada cadeia vazia nova cadeia ”Monalisa”
Utilizaremos o símbolo □ para indicar o caractere A cadeia vazia é o elemento neutro da
espaço quando não existir outra forma clara de concatenação
mostrar que ele faz parte da cadeia x+” ” = ” ”+x = x
Note que ”□” contém o caractere branco e não
deve ser confundida com a cadeia vazia Concatenação é associativa
(x+y)+z = x+(y+z) = x+y+z
19 20
Atribuição Comparação
Se cidade é uma variável tipo cadeia, então o comando
cidade Å ”Brasil” + ”ia”
Dadas duas cadeias x=x1x2...xn e y=y1y2...ym
atribuirá ”Brasilia” à variável cidade
Qualquer variável tipo cadeia pode assumir um valor tipo cadeia cujo
A condição x = y é considerada verdadeira
comprimento é um número finito se
O comprimento de uma cadeia é o número de caracteres dessa cadeia
Algumas linguagens de programação requerem que um comprimento
x e y têm o mesmo número de caracteres (n=m)
máximo seja especificado para cada cadeia declarada xi=yi para todo 1 <= i <= n
Em nossa notação algorítmica não utilizaremos esta limitação
Uma expressão com cadeias pode conter variáveis tipo cadeia assim A condição ”Maria” = ”Maria” é verdadeira
como constantes tipo cadeia enquanto ”Brilha”= ”Brilhar” é falsa
a Å ”Ciencia”
b Å ”Computacao”
c Å a + ”□da□” + b
A relação de desigualdade é a negação da
As variáveis a,b e c são do tipo cadeia e o valor resultante c é ”Ciencia da igualdade
Computacao”
As condições ”Maria□” ≠ ”Maria” e ”Brilha” ≠
”Brilhar” são ambas verdadeiras
21 22
4
Cadeias em C++ Cadeias em C++
Para utilizar cadeias de caracteres (strings) em Strings podem ser lidas utilizando o comando cin
C++ é necessário incluir o arquivo header string s;
cin >> s;
#include <string>
Strings são declaradas da mesma forma os tipos Strings lidas por meio do comando cin são
de dados primitivos, tais como inteiros ou reais, delimitadas por caracteres separadores (por
utilizando o tipo string exemplo, um espaço)
string s1, s2, s3; Assim para ler uma string que contenha espaço é
declara s1, s2 e s3 como variáveis do tipo string conveniente utilizar a função getline cujo
É possível declarar uma string e atribuir seu valor delimitador é um caractere de nova linha (‘\n’)
inicial junto ao comando de declaração string s;
string s1=“Maria”, s2=“Pedro”, s3=“”; getline(cin,s);
25 26
27 28
A variável x conterá a sub-cadeia “plano” que inicia no A variável s conterá a sub-cadeia “O aeroplano”; todos
os caracteres desde o índice 11 (inclusive) até o final da
índice 6 e consiste de 5 caracteres cadeia são apagados
Pesquisa por sub-cadeia Substituindo caracteres
int pos; string s = ”O aeroplano decolou”;
string s = ”O aeroplano decolou”; s.replace(2,9,”aviao”);
pos = s.find(”de”); A variável s conterá a cadeia “O aviao decolou”; todos 9
A variável pos conterá o valor 12 que é o índice onde a caracteres que iniciam no índice 2 foram trocados por
sub-cadeia “de” foi encontrada “aviao”
Se a sub-cadeia não é encontrada, o sistema retorna a Existem outros métodos (funções e
constante string::npos procedimentos) de manipulação de strings em C++
29 30
5
Exercícios Solução Exercício 1
#include <iostream>
1. Elabore um algoritmo que leia uma cadeia de caracteres, #include <string>
escrevendo-a de trás para frente using namespace std;
//--------------------------------------
2. Elabore um algoritmo que leia uma cadeia de caracteres, // Retorna string s de tras para frente
string reverso(string s)
converta todas as letras minúsculas em maiúsculas e { int i;
todas as letras maiúsculas em minúsculas, escrevendo a string r="";
31 32
33 34
35 36
6
Cadeias em C Cadeias em C
É possível declarar uma string e dar o seu Problema:
valor inicial junto ao comando de declaração char x[10], y[10];
x = “Ola”;
Por exemplo: x = y; /* Não faça isso! */
char nome[7] = “Maria”; x = x + y; /* Não faça isso! */
char s[6] = “a bcde”; if (x == y)... /* Não faça isso! */
Strings não podem ser atribuídas ou
nome M
0 1
a
2
r
3
i
4
a
5
\0
6
comparadas diretamente
Strings são normalmente manipuladas por
0 1 2 3 4 5 intermédio de funções de biblioteca
s a b c d \0
#include <string.h>
37 38
Cadeias em C Cadeias em C
Strings são normalmente manipuladas por meio de funções da biblioteca
#include <string.h>: Solução
gets(nome_da_string);
lê uma string do teclado, incluindo espaços em branco até encontrar <ENTER>
char x[10], y[10];
strcpy(string_destino,string_origem); No lugar de: Utilize:
copia a string-origem para a string-destino
strcat(string_destino,string_origem); x = “Ola”; strcpy(x,”Ola”);
a string de origem permanecerá inalterada e será anexada ao fim da string de destino
strlen(string); x = y; strcpy(x,y);
retorna o comprimento da string fornecida
strcmp(string1,string2); x = x + y; strcat(x,y);
compara a string1 com a string2, retorna -1 se string1 < string2, zero se string1 == string2 e
+1 se string1 > string2. O compilador diferencia maiúsculas de minúsculas bem como de if(x == y)... if(strcmp(x,y) == 0)...
letras com e sem acento.
stricmp(string1,string2); if(x < y)... if(strcmp(x,y) == -1)...
compara a string1 com a string2, retorna -1 se string1 < string2, zero se string1 == string2 e
+1 se string1 > string2. O compilador não diferencia maiúsculas de minúsculas mas
diferencia letras com e sem acento.
if(x > y)... if(strcmp(x,y) == 1)...
Existem outras funções de manipulação de strings em C
39 40
7
Exemplo strcpy Copiando Cadeias
#include <iostream> #include <iostream>
#include <string.h> #include <string.h>
using namespace std; using namespace std;
int main() int main()
{ char a[100],b[100];
{ char str1[100],str2[100],str3[100];
gets(a);// Ler string
cout << "Entre uma string: ";
gets(str1); // Copiar a para b
strcpy(str2,str1); strcpy(b,a);
strcpy(str3,"Voce digitou a string ");
cout << "\n\n" << str3 << str2; cout << “Copia = ” <<b << endl;
return 0; return 0;
} }
43 44