Title: Cap
1(No Transcript)
2Capítulo 9
Strings
Criado por Frederick H. Colclough, Colorado
Technical University
3Objetivos do Estudo
- Um Tipo Vetor para Strings
- Strings C
- Ferramentas de Manipulação de Caracteres
- E/S de caracteres
- Funções-membros get E put
- Funções-membro putback, peek E ignore
- Classe-Padrão string
- Processamento de Strings
4Introdução
- Dois tipos string
- Strings C
- Vetor com tipo-base char
- Final da string é marcado com nulo, \0
- Antigo método herdado do C
- Classe String
- Utiliza Modelos (Templates)
5Strings C
- Vetor com tipo-base char
- Um caractere por variável indexada
- Um caracter extra \0
- Chamado caractere nulo
- Marcador de final
- Nós usamos strings C
- A literal Olá armazenada como string C
6Variável String C
- Vetor de caractereschar s10
- Declara uma variável string C para guardar até
9caracteres - um caracter nulo
- Vetor parcialmente preechido
- Grande o bastante para guardar o tamanho máximo
da string - Indicar o final com o caractere nulo
- A única diferença de um vetor padrão
- Deve conter o caracter nulo
7Armazenamento String C
- Um vetor com tipo-base charchar s10
- Se s contém a string Oi, mamãe!, ela é
armazenada - como
Painel página 242
8Inicialização de uma String C
- Pode-se inicializar uma string Cchar
minhaMensagem20 Oi você aí. - Não é necessário preencher o vetor inteiro
- Inicialização coloca \0 no final
- Pode-se omitir o tamanho do vetorchar
stringCurta abc - A variável string C receberá o tamanho do
- comprimento da string C mais um.
- NÃO comochar stringCurta a, b, c
9Índices de uma String C
- Uma string C é um vetor
- Pode-se acessar variáveis indexadas dechar
nossaString5 Oi - nossaString0 é O
- nossaString1 é i
- nossaString2 é \0
- nossaString3 é desconhecido
- nossaString4 é desconhecido
10Manipulação de Índices de uma String C
- Pode-se manipular as variáveis indexadaschar
felizString7 "LaRaRa" - felizString6 Z
- Cuidado!
- Aqui, \0 (nulo) foi sobrescrito por um Z!
- Se nulo foi sobrescrito, string C não agemais
como uma string C! - Resultados Imprevisíveis!
11Biblioteca
- Declarando strings C
- Não requer nenhuma biblioteca C
- Predefinição de C
- Manipulações
- Requerem a Biblioteca ltcstringgt
- Incluída quando estiver usando strings C
- Geralmente necessária para a diversão com elas
12 e com strings C
- strings C não são como outra variáveis
- Não se pode atribuir ou compararchar
umaString10umaString Olá // ILEGAL! - Pode-se somente usar na declaração de uma
string C! - Deve-se usar uma função da biblioteca para
atribuiçõesstrcpy(umaString, Olá) - Função predefinida (em ltcstringgt)
- Torna o valor de umaString igual a Olá
- Nenhum controle de tamanho!
- O programador deve controlar, exatamente como em
outros vetores!
13Comparando strings C
- Também não se pode usar o operador char
umaString10 Oláchar outraString10
Até logo - umaString outraString // NÃO permitido!
- Deve-se usar uma função da biblioteca
novamenteif (strcmp(umaString, outraString))
cout ltlt As strings não são iguais.else cout
ltlt As strings são iguais.
14A Biblioteca ltcstringgt
- Cheia de funções de manipulação de stings
Painel 9.1 página 245
15A Biblioteca ltcstringgt (cont)
- Cheia de funções de manipulação de stings
Painel 9.1 página 246
16Funções String C strlen()
- Freqüentemente usado para saber o
- comprimento da stringchar minhaString10
LaRaRacout ltlt strlen(minhaString) - Retorna o número de caracteres
- Não incluindo o caractere nulo
- Resultado 6
17Funções String C strcat()
- strcat()
- Concatenação de Stringchar varString20 "O
rato" - strcat(varString, "roeu")
- Observe o resultadovarString agora contém O
ratoroeu - Cuidado!
- Incorpore os espaços quando necessário!
18Argumentos e Parâmetros de string C
- Lembre-se string C é um vetor
- Então um parâmetro string C é um parâmetro de
vetor - strings C passadas para funções podem
sermodificadas pelas funções que recebem! - Como todos os vetores, incluir o tamanho também
- Uma função poderia usar também \0 para
encontrar o final - Assim o tamanho não é necessário se a função
- não for modificar o parâmetro
- Use o modificador const para proteger a string
C
19Saída de String C
- Strings C podem ser enviadas para a
- saída com o operador de inserção, ltlt.
- Como nós já temos feitocout ltlt notícia ltlt
UAU.\n - Onde notícia é uma variável string C
- Possível porque o operador ltlt ésobrecarregado
para strings C!
20Entrada para String C
- É possível preencher uma variável string C
- por meio do operador de entrada gtgt
- Isto é possível, porém
- Espaço em branco é delimitador
- Tabulação, espaço e quebra de linha são
omitidos - A leitura pára no próximo delimitador
- Esteja alerta para o tamanho da string C
- Deve ser grande o bastante para armazenar a
string - inteira!
- C não emite nenhum aviso!
21Exemplo de Entrada para String C
- char a80, b80cout ltlt Digite alguma
coisa\ncin gtgt a gtgt bcout ltlt a ltlt b ltlt FIM
DA ENTRADA\n - Diálogo apresentado Digite alguma coisa La
ra ra para você! LaraFIM DA ENTRADA - Note A parte sublinhada foi digitada
- String C a recebe La
- String C b recebe ra
22Entrada de Linha para a String C
- Pode-se receber uma linha inteira dentro da
string C - Use a função-membro predefinida getline()
- char a80cout ltlt Digite alguma
coisa\ncin.getline(a, 80)cout ltlt a ltlt FIM
DA ENTRADA\n - DiálogoDigite alguma coisa La ra ra para
você! La ra ra para você!FIM DA ENTRADA
23Mais Sobre getline()
- Pode-se explicitamente informar o tamanho que
será recebidochar stringCurta5cout ltlt
Digite alguma coisa\ncin.getline(stringCurta,
5)cout ltlt stringCurta ltlt FIM DA ENTRADA\n - Resulta emDigite alguma coisa
larararamlaraFIM DA ENTRADA - Força a leitura de somente QUATRO caracteres
- É necessário lembrar do caracter nulo
24E/S de Caracteres
- Entrada e Saída de dados
- Todos tratados como caracteres
- ex. número 10 apresentado como 1 e 0
- Conversão feita automaticamente
- Utiliza recursos de baixo-nível
- Podemos também usar os mesmos
- recursos de baixo-nível para nós
25Função-membro get()
- Lê um caractere de cada vez
- Função-membro do objeto cinchar
proximoSimbolocin.get(proximoSimbolo) - Lê o próximo caractere e coloca-o na
variávelproximoSimbolo - O argumento deve ser um tipo char
- Não uma string!
26Função-membro put()
- Apresenta um caracter de cada vez
- Função-membro do objeto cout
- Exemploscout.put(a)
- Apresentará como saída na tela a letra a
- char minhaString10 Olácout.put(minhaStrin
g1) - Apresentará como saída na tela a letra l
27Mais Sobre Funções-membros
- putback()
- Lê uma vez, pode ser necessário devolvê-lo
- cin.putback(ultimoCaractere)
- peek()
- Retorna o próximo caractere, mas deixa-o lá
- peekChar cin.peek()
- ignore()
- Ignora a entrada, até o caractere designado
- cin.ignore(1000, \n)
- Salta no máximo 1000 caracteres até \n
28Funções de Manipulação de Caracteres
Painel 9.3 página 255
29Funções de Manipulação de Caracteres (cont)
Painel 9.3 página 256
30Classe-Padrão string
- Definida na Bibliotecainclude ltstringgtusing
namespace std - Variáveis String e Expressões
- Tratadas como tipos simples
- Pode-se atribuir, comparar, adicionarstring s1,
s2, s3s3 s1 s2 //Concatenaçãos3 Olá
mamãe! //Atribuição - Note que a string C Olá mamãe! foi
automaticamenteconvertida para o tipo string!
31Programa Usando a Classe String
Painel 9.4 página 259
32E/S com a Classe string
- Exatamente como em outros tipos!
- string s1, s2cin gtgt s1cin gtgt s2
- ResultaSe o usuário digitarQue os pêlos dos
seus dedos do pé fiquem longos e encaracolados! - A extração ainda ignora os espaços em brancos1
recebe o valor Ques2 recebe o valor os
33getline() com a Classe string
- Para linhas completasstring linha
- cout ltlt "Digite uma linha de entrada\n"
- getline(cin, linha)
- cout ltlt linha ltlt "FIM DA ENTRADA\n"
- Diálogo produzidoDigite alguma coisa
- La ra ra para você!
- La ra ra para você!FIM DA ENTRADA
- Semelhante ao uso de getline() com strings C
34Outras Versões de getline()
- Pode-se especificar o caracter delimitadorstri
ng linha - cout ltlt "Digite alguma coisa\n"
- getline(cin, linha, ?)
- Recebe a entrada até que ? seja encontrado
- getline() retorna uma referência
- string s1, s2getline(cin, s1) gtgt s2
- Resulta em (cin) gtgt s2
35Armadilha Misturando Métodos de Entrada
- Cuidado ao misturar cin gtgt variável and getline
- int nstring linhacin gtgt ngetline(cin,
linha) - Se a entrada for 42 Olá mochileiro.
- A variável n recebe realmente 42
- linha é fixado como igual à string vazia!
- cin gtgt n ignorou os espaços em branco,
deixando\n para a próxima entrada para
getline()!
36Processamento de Strings com a Classe string
- Mesmas operações disponíveis para Strings C
- E mais!
- Há mais de 100 membros e outras funções
associadas - Algumas funções-membros
- .length()
- Retorna o comprimento de uma string variável
- .at(i)
- Retorna uma referência ao caracter na posição i
37Funções-membros da classe-padrão string
Página 9.7 página 265
38Funções-membros da classe-padrão string (cont)
Página 9.7 página 266
39Conversão entre Objetos String e Strings C
- Conversões automáticas de tipos
- de string C para objeto stringchar umaStringC
"Esta é a minha string C." - string variavelString
- variavelString umaStringC
- Perfeitamente legal e apropriada!
- umaStringC variavelString
- ILEGAL!
- Não pode converter automaticamente para string C
- Deve usar conversão explícitastrcpy(umaStringC,
variavelString.c_str( ))
40Sumário
- Variável string C é um vetor de caracteres
- Com a adição de um caracter nulo, \0
- Strings C agem como vetores
- Não podem ser atribuídos nem comparados como
variáveis simples - Biblioteca ltcctypegt e ltstringgt têm funções muito
úteis para manipular strings - cin.get() lê o próximo caracter simples
- Versões de getline() permitem a leitura da linha
inteira - Objects Classe string comportam-se melhor
questrings C