Aula 08

Você também pode gostar

Você está na página 1de 11

Linguagem da Programação I

8º Aula

Strings

Olá pessoal,
Sejam bem-vindos à nossa última aula. Nela trataremos de um vetor
voltado para caracteres, ou seja, variáveis para armazenar nomes e frases. Nesta
aula será apresentado como trabalhar com string em c e em c++, mostrandoa
diferença entre os dois modelos.
Vamos lá!
Boa aula!
Bons estudos!

Objetivos de aprendizagem

Ao término desta aula, vocês serão capazes de:

• ler textos através da programação C ou C++;


• comparar strings;
• ter conhecimento de funções que facilitarão na programação com strings;
• escolher quais tipos de vetores de caracteres para programar.
49
errado utilizar o operador de endereço (&) junto ao nome do
Seções de estudo vetor (BUENO, 2002).
Por exemplo, quando fazemos referência ao vetor palavra
do código abaixo, é equivalente a & palavra [0].
1 - String em C #include <stdio.h>
2 - Funções de caracteres úteis int main () /*Este código possui um ERRO!!! O & no
3 - Cabeçalho de um programa com strings em C++ scanf do vetor/string*/
4 - Declarando e Inicializando uma String {
5 - Leitura e Escrita de Strings na Tela char sPalavra [100];
6 - Operações com Strings printf (“Digite uma palavra: “);
7 - Biblioteca cctype: operações com caracteres scanf (“%s”, &sPalavra);
8 - Exemplos de como manipular strings em C++ printf (“\n\n Você digitou %s”, sPalavra);
9 - Convertendo C-string e número return (0);
}
1 - String em C Para que esse mesmo código fique correto, basta retirar o
operador (&) que está junto ao nome da string, ficando então
da seguinte forma:
Não falamos até agora de vetores de caracteres, apesar de #include <stdio.h>
já utilizá-las várias vezes. Um vetor de caracteres é normalmente int main ()
chamada de “string” em linguagem de programação. Em C++, /*Este código ESTA CORRETO!! FOI RETIRADO O
existem duas maneiras de se criar e trabalhar com strings. Um & no scanf do
deles é o método antigo, já utilizado pela linguagem C, de se vetor/string*/
declarar e trabalhar com um vetor de caracteres do mesmo {
modo que trabalhamos com vetores numéricos. O outro char sPalavra [100];
método é utilizar as facilidades da biblioteca padrão de C++, printf (“Digite uma palavra: “);
que define um tipo de variável específico para strings, com scanf (“%s”, sPalavra);
várias operações e funções próprias. Neste guia de estudos sPalavra
trabalharemos com as strings do tipo C++, por serem elas mais printf (“\n\n Você digitou %s”, sPalavra);
simples e ao mesmo tempo apresentarem mais recursos do que return (0);
as strings tipo C. }
O uso de strings facilita a manipulação de palavras e
textos. Strings são basicamente vetores do tipo char, porém # Nesse programa acima, o tamanho máximo da string
diferentemente de simples vetores, strings são “terminados” em C que você pode entrar é uma string de 99 caracteres.
por um caractere “ \0”. Utilize “%s” para ler e imprimir strings Funções da biblioteca padrão
nas funções scanf e printf. Você pode utilizar strings constantes A biblioteca padrão fornece várias funções úteis para
para carregar vetores de caracteres nas suas declarações. Uma manipular strings. A seguir mostraremos algumas delas. Para
constante do tipo string é definida por uma sequência de usá-las, você deve incluir o cabeçalho string.h no início dos
caracteres entre aspas duplas (lembre-se de que uma constante seus arquivos.
do tipo char e um caractere entre apostrofes). Para declarar strlen
uma string, podemos usar o seguinte formato geral: strlen retorna o tamanho, em caracteres, de uma string
char nome_da_string [tamanho]; dada. Na verdade o strlen() procura o terminador de string e
Isso declara um vetor de caracteres (uma string) com calcula a distância dele ao início da string. Por exemplo:
número de posições igual a tamanho. Note que, como temos
que reservar um caractere para ser o terminador nulo, temos char nome [15] = “Maria da Silva”;
que declarar o comprimento da string como sendo, no mínimo, int s = strlen (nome);
um caractere maior que a maior string que pretendemos // s conterá o valor 14
armazenar. Vamos supor que declaremos uma string de 8 strcpy
posições e coloquemos a palavra “casa” nela. Teremos: strcpy copia o conteúdo de uma string para outra e
coloca um terminador de string. Sua sintaxe é
C A S A \0 strcpy (destino, origem).
No caso acima, as duas células não usadas têm valores char nome[] = “Clarice Lispector”;
indeterminados. Isso acontece porque a linguagem C não char nome2[] = “Oswald de Andrade”;
inicializa variáveis, cabendo ao programador essa tarefa. strcpy (nome, nome2);
Portanto, as únicas células que são inicializadas são as que // agora nome conterá “Oswald de Andrade”
contêm os caracteres ‘c’, ‘a’, ‘s’, ‘a’ e ‘\0’.
Atenção: Existe um detalhe muito importante quanto à Tome cuidado com strcpy(), pois se a string a ser copiada
leitura de strings pelo teclado. O identificador (nome) de um for maior que a string de destino, provavelmente você gravará
vetor/matriz retorna automaticamente o endereço inicial dados em lugares indesejados ― um problema conhecido
na memória que esse vetor está armazenado. Assim sendo, é como estouro de buffer. Para evitar esse problema, use
Linguagem da Programação I 50
a função strncpy, que recebe um terceiro argumento que memcpy
corresponde ao número máximo de caracteres a serem Sintaxe:
copiados (VICTORINE, 2005). #include <string.h>
char msg[] = “Bom dia!”;
char nome[] = “Maria da Silva”; void *memcpy (void *dest, const void *srce, size_t n);
strncpy (msg, nome, strlen (msg));
Descrição: copiar um bloco de n octetos de srce para dest.
// agora msg conterá “Maria da”
strcat Atenção:
strcat concatena duas strings, adicionando o conteúdo Se as regiões de srce e dest se sobreporem, o
da segunda ao final da primeira, além do terminador (\0). comportamento da função é imprevisível.
Note que a primeira string deve ter espaço suficiente para Valor de retorno: memcpy retorna o valor de dest.
conter a segunda, para que não ocorra um “estouro de Ex:
buffer”. Por exemplo:
char nome [50] = “Maria”; #include <stdio.h>
char sobrenome[] = “ da Silva”; #include <string.h>
strcat (nome, sobrenome);
// agora nome contém “Maria da Silva” int main() {
Analogamente à função strncpy, existe também a função int tab[2][5] = { { 1, 2, 3, 4, 5},
strncat, onde o número máximo de caracteres a serem {11, 12, 13, 14, 15} };
copiados é o terceiro argumento. int temp[2][5];
strcmp
Se você tentar criar duas strings com o mesmo conteúdo memcpy (temp, tab, sizeof(tab));
e compará-las como faria com números, verá que elas “não puts (“Resultado:\n”);
são iguais”. Isso ocorre porque, na verdade, o que está sendo printf (“temp[1][4] = %d\n”, temp[1][4]);
comparado são os endereços de memória onde estão guardadas return 0;
as strings. Para comparar o conteúdo de duas strings, você deve }
usar a função strcmp (ou suas variantes) (VICTORINE, memset
2005). Sintaxe:
int strcmp (char *s1, char *s2); #include <string.h>
O valor de retorno é:
• menor que zero se s1 for menor que s2; void *memset (void *buffer, int c, size_t n);
• igual a zero se s1 e s2 são iguais; Descrição: memset inicializa n octetos do buffer com o
• maior que zero se s1 for maior que s2. inteiro c.
Valor de retorno: o valor do buffer.
Costuma parecer estranho dizer que uma string é menor Ex:
ou maior que outra; na verdade essa comparação é entre a #include <stdio.h>
primeira letra que difere nas duas strings. Assim, se tivermos #include <string.h>
s1 = “abc” e s2 = “abcd”, diremos que s2 é maior que s1, pois
na primeira posição em que as duas strings diferem, a letra em int main() {
s2 é “maior”. char buf[] = “W.I.K.I.”;
É importante notar que a comparação feita por strcmp
distingue maiúsculas de minúsculas. Isto é, as strings “ABC” e printf (“Buf antes ‘memset’: %s\n”, buf);
“abc” não são iguais para essa função. sprintf
As variantes mais usadas de strcmp são: Descrição: A diferença entre printf e sprintf é que printf
• strncmp - compara apenas os n primeiros caracteres retorna o resultado para a saída padrão (tela), enquanto sprintf
das duas strings, sendo n um terceiro argumento. retorna o resultado em uma variável. Isso é muito conveniente,
• stricmp - compara duas strings sem distinção entre porque você pode simplesmente digitar a frase que você quer
maiúsculas e minúsculas. A sintaxe é igual à de strcmp. Essa ter e sprintf lida com a própria conversão e coloca o resultado
função não faz parte da biblioteca padrão, mas é comumente na string que você deseja (NORTON, 1994).
encontrada como extensão particular de várias delas. Sintaxe:
strrchr #include <stdio.h>
strrchr retorna um ponteiro sobre a última ocorrência
de c de uma string, apontada por s se não retorna NULL . Sua int sprint (char *s, const char *formato, ...);
sintaxe é strrchr (const char *s, int c). Ex:
Exemplo: #include <stdio.h>
char path [50] = “/teste/string”; #include <string.h>
char *p = strrchr(path, ‘/’);
*p++; int main() {
Printf (“Resultado: %s \n”, p); char var[256];
51
char sobrenome[] = “Simpson”; áreas de memória que não temos como definir o que são e,
char nome[] = “Homer”; portanto poderemos fazer o programa parar de funcionar.
Em muitos sistemas pode também haver danos aos outros
int idade = 30; programas e até mesmo ao próprio sistema operacional.
Porém, em sistemas operacionais mais sofisticados como o
sprintf (var, “%s %s tem %d anos”, sobrenome, GNU/Linux, que possuem gerenciamento de memória com
nome, idade); proteção de memória, apenas o programa que causou a falha
irá parar de funcionar.
printf (“Resultado : %s\n”, var); Para manipular esse tipo de string a biblioteca padrão da
linguagem C dispõe de diversas funções.
return 0; Vale a pena ler o livro: Programar. Disponível em:
} <https://pt.wikibooks.org/wiki/Programar_em_C>.
Acesso em: 25 de nov. 2017.
2 - Funções de caracteres úteis No estilo C++, como era de se esperar, as strings são
objetos, eles podem ser criados facilmente através da biblioteca
As seguintes funções estão no cabeçalho da biblioteca padrão referenciada pelo arquivo de cabeçalho <string>. As
<cctype> strings são objetos com recursos que permitem manipular
toupper() – (to+upper) retorna à maiúscula de uma os seus caracteres com as funcionalidades das funções
letra. É uma função de um argumento – o caractere. No caso da linguagem C e mais algumas características próprias
do argumento não ser uma letra, a função retorna o mesmo possibilitadas pela orientação a objetos (JAMSA, 1999).
caractere que é argumento.
tolower() – (to+lower) o mesmo comportamento que Todo programa que utilize strings deve conter a seguinte
toupper(), porém com o resultado em minúscula. linha de inclusão em seu cabeçalho:
#include <iostream> #include <string>
#include <cctype> #include <cstring>
using namespace std; #include <string.h>

Isso faz com que o compilador inclua no programa a


int main(void) biblioteca padrão de strings de C++, que contém todas as
{ definições do tipo string, assim como as funções e facilidades
char ch; relacionadas a esse tipo. Assim, o cabeçalho de um programa
do { típico envolvendo strings será:
cout << “Pressionar S ou s para sair, \n qualquer #include <iostream>
outra tecla para continuar: “; #include <string>
cin.get (ch); using namespace std;
ch = toupper (ch); A biblioteca C++ possui uma grande quantidade de
if (ch! = ‘\n’) funções que facilitam o uso do tipo string, tais como, separar
cin.ignore(); um string, retornar somente uma parte da string e entre
if (ch! = ‘S’) outros.
cout << “Deseja continuar?\n”; Para saber mais sobre C++, veja os seguintes links:
else <C++ Reference> e <Cpluplus.com>. Acesso em: 25 de
cout << “Saindo...”; nov. 2017.
} while (ch! = ‘S’);

#ifdef WIN32 4 - Declarando e Inicializando uma


system (“pause”); String
#endif
Declaramos strings da mesma maneira que declaramos
return 0; variáveis: explicitando o tipo da variável (no caso, string) e seu
} nome. Veja a sintaxe e o exemplo abaixo:
string <nome da string>;
string nacionalidade;
3 - Cabeçalho de um programa com string sobrenome;
strings em C++ Uma string declarada dessa forma estará vazia até que um
valor seja atribuído a ela, das maneiras já estudadas: através de
O modelo de string declarado como vetor apresentado uma atribuição, ou de uma entrada de dados do usuário, por
acima é o estilo de strings usado pela linguagem C pura. Para exemplo.
manipular esse tipo de string é preciso ter certo cuidado, pois C++ possui uma série de facilidades para a inicialização
o vetor sempre tem um tamanho definido e caso façamos de strings. Cada um desses diferentes métodos é chamado de
um acesso a um endereço fora do vetor, invadiremos outras
Linguagem da Programação I 52
“inicializador” de uma string (Sonoda, 2006). Abaixo serão #include <iostream>
apresentados os quatro principais inicializadores de string(): #include <string>
string s1; - Cria uma string vazia, chamada s1. Esta é a using namespace std;
inicialização default de uma string: toda string criada dessa forma está int main()
vazia. {
string s2 (s1); - Cria a string s2 como uma cópia de outra string string nome;
(nesse caso, s1). string sobrenome;
string s2 (“Esta é uma string literal”); - Cria a string s2 como cout<<”Digite seu nome: “;
uma cópia da string literal entre os parênteses. cin >> nome;
string s2 (x, ‘c’); - Cria a string s2, que contém x cópias do cout<<”Digite seu sobrenome: “;
caractere entre aspas (no caso, c). cin >> sobrenome;
O programa abaixo exemplifica os métodos descritos cout << “Seu nome é “<<nome<<” e seu sobrenome é
acima: “<<sobrenome<<”.”<<endl;
#include <iostream> system (“PAUSE > null”);
#include <string> return 0;
using namespace std; }
int main() Esse programa apresenta alguns problemas quando
{ o usuário possui mais de um nome ou sobrenome. Por
string vazia; exemplo, caso o nome “José Ricardo” seja inserido, a leitura
string ditado (“Casa de ferreiro, espeto de pau”); do sobrenome será “ignorada” e o programa exibirá “José”
string cópia_ditado (ditado); como o nome e “Ricardo” como sobrenome. Da mesma
string letra_z ( 42, ‘z’); forma, no caso da entrada de um sobrenome duplo, somente o
cout <<”Mostrando o conteúdo da string ‘vazia’:”<< primeiro sobrenome é guardado na string “sobrenome”, sendo
endl; o segundo “ignorado”. Isto acontece por causa da maneira que
cout << vazia; C++ trata os espaços em branco em uma entrada via teclado
cout <<”Mostrando o conteúdo da string ‘ditado’:”<< (JAMSA, 1999).
endl; Espaços em branco são considerados fim de entrada pelo
cout << ditado; comando cin; ao invés de descartar os caracteres que vierem
cout <<”Mostrando o conteúdo da string ‘cópia_ após o espaço em branco, C++ os guarda em um buffer
ditado’:”<< endl; (uma espécie de “reserva” ou pilha de dados). Quando cin for
cout << cópia_ditado; chamado novamente, antes de ler a nova entrada do teclado,
cout <<”Mostrando o conteúdo da string ‘letra_z’:”<< o programa primeiro utiliza os dados que estão nesse buffer.
endl; Assim, temos a impressão que a nova entrada de dados foi
cout << letra_z; descartada pelo programa, mas na verdade ela foi jogada no
system (“PAUSE > null”); buffer, esperando uma nova chamada de cin.
return 0; Dessa forma, cin não é o método recomendado para ler
} frases inteiras, com palavras separadas por espaços. Para esse
objetivo, utilizamos o método cin.getline, que já estudamos no
módulo 5, com algumas alterações.
5 - Leitura e Escrita de Strings na Tela O método cin.getline lê linhas inteiras de entrada através
do teclado, sem se importar com os espaços em branco. Mas
a sintaxe do método cin.getline é um pouco diferente, quando
Utilizamos cin e cout para ler e escrever strings, assim trabalhamos com strings:
como fazemos com variáveis simples. Basicamente, cin e cout getline (cin, <nome da string>);
tratam strings como se fossem variáveis simples, facilitando Assim, esse método recebe todos os caracteres (incluindo
sua manipulação e seu uso em programas. os espaços em branco) entrados pelo usuário, até que ele aperte
Já vimos no programa exemplo anterior que utilizamos a tecla Enter. O programa abaixo é uma versão melhorada do
cout para exibir strings inteiras na tela. O cout exibe todos os programa anterior, utilizando o método cin.getline para receber
caracteres da string, e detecta automaticamente o fim dela. os dados desejados.
Utiliza-se o comando cin para ler strings através do #include <iostream>
teclado. A sintaxe é a seguinte: #include <string>
cin >> <nome da strin>; using namespace std;
Como já vimos, cin lerá os caracteres inseridos através int main()
do teclado até encontrar um espaço em branco (tecla barra {
de espaço) ou o fim da entrada (tecla Enter). Quando cin string nome;
encontra um espaço em branco, todos os caracteres após string sobrenome;
este espaço são ignorados. O programa abaixo lê entradas cout<<”Digite seu nome: “;
do teclado para armazenar o nome e sobrenome do usuário getline (cin, nome);
dentro de strings. cout<<”Digite seu sobrenome: “;
53
getline (cin, sobrenome);
cout <<”Seu nome é “<<nome<<” e seu sobrenome é 7 - Biblioteca cctype: operações com
“<<sobrenome<<”.”<<endl; caracteres
system (“PAUSE > null”);
return 0; A biblioteca cctype é uma versão da biblioteca ctype
} da linguagem C, convertida para C++. Ela contém diversas
funções que permitem processar os caracteres de uma string,
um por um. Por exemplo, podemos precisar saber se um
6 - Operações com Strings determinado carácter é uma letra ou um número, se está
acentuado ou não, se é minúsculo ou maiúsculo, e transformar
C++ possui uma série de funções e operações próprias esse caractere. Para utilizar essa biblioteca, precisamos declará-
para strings. A tabela abaixo resume as operações mais utilizadas la no cabeçalho do programa, assim como fizemos com a
(s é uma string qualquer): biblioteca de strings. Para declará-la, a sintaxe é a seguinte:
• s.empty ( ) - Função que retorna verdadeiro se a string #include <cctype>
está vazia, e falso caso contrário.
Assim, o cabeçalho de um programa que utiliza strings e
• s.size ( ) - Função que retorna o tamanho em caracteres
a biblioteca cctype ficaria da seguinte forma:
da string.
#include <iostream>
• s [n] - Acessa um elemento da string. Funciona
#include <string>
exatamente com um elemento de uma matriz.
#include <cctype>
• s1 + s2 - Concatena duas strings.
using namespace std;
• s1 = s2 - Atribui o conteúdo de s2 na string s1.
• s1 == s2 - Testa a igualdade entre s1 e s2 (retorna Abaixo serão apresentadas algumas das funções mais
verdadeiro se as duas strings forem iguais). Duas strings úteis desta biblioteca (x é um elemento de uma string, por
são consideradas iguais se elas tiverem o mesmo número de exemplo, “sobrenome [4]”):
caracteres e seus caracteres forem iguais. •isalnum (x) - Retorna verdadeiro (1) caso x for uma letra
A primeira função, <string>.empty indica se uma string ou um número.
está vazia ou não. Essa função retorna um valor booleano •isalpha (x) - Retorna verdadeiro (1) caso x for uma letra.
verdadeiro (true ou 1) caso a string esteja vazia, caso contrário •iscntrl (x) - Retorna verdadeiro (1) caso x for um dígito
ela retorna falso (false ou 0). de controle.
A função <string>.size é bastante útil para trabalhar •isdigit (x) - Retorna verdadeiro (1) caso x for um número.
com strings entradas pelo usuário. Como não podemos saber •isgraph (x) - Retorna verdadeiro (1) caso x não for um
exatamente o número de caracteres entrados pelo usuário, é espaço.
útil ter uma função que nos retorne o tamanho de uma string. •islower (x) - Retorna verdadeiro (1) caso x for uma letra
A concatenação de strings é particularmente útil. Quando minúscula.
utilizamos o sinal de soma entre duas strings, estamos •isprint (x) - Retorna verdadeiro (1) caso x for um
concatenando elas, ou seja, juntando o começo da segunda caractere imprimível.
matriz com o final da primeira. Também é possível concatenar •ispunct (x) - Retorna verdadeiro (1) caso x for um
strings literais (frases entre aspas) junto com as variáveis string caractere acentuado.
•isspace (x) - Retorna verdadeiro (1) caso x for um espaço
dessa forma. O programa abaixo ilustra a concatenação de
em branco.
strings.
•isupper (x) - Retorna verdadeiro (1) caso x for uma letra
#include <iostream>
maiúscula
#include <string>
•isxdigit (x) - Retorna verdadeiro (1) caso x for um
using namespace std;
número hexadecimal.
int main() •tolower (x) - Transforma um caractere maiúsculo em
{ minúsculo.
string nome; •toupper (x) - Transforma um caractere minúsculo em
string sobrenome; maiúsculo.
cout<<”Digite seu nome: “; Com exceção das duas últimas funções que transformam
getline (cin, nome); caracteres, todas as outras testam os caracteres de uma string,
cout<<”Digite seu sobrenome: “; retornando valores booleanos (true ou false, 1 ou 0). O
getline (cin, sobrenome); programa abaixo mostra o uso de algumas dessas funções,
string concatena; através da leitura de uma string entrada pelo usuário. Note que
concatena = nome + sobrenome; também é feito o uso da função <string>.size para determinar
cout << “O seu nome completo é : “ + nome + “ “ + o tamanho da string.
sobrenome << endl; #include <iostream>
system (“PAUSE > null”); #include <string>
return 0; using namespace std;
} int main()
Linguagem da Programação I 54
{ de operar strings em C e C++. Algumas particularidades da
string frase; linguagem C++ permitem uma operação mais intuitiva das
int letras = 0, maiúsculas = 0, minúsculas = 0, números strings e algumas novas formas de tratá-las. Vejamos como
= 0; manipular esses dados tão comuns em qualquer programa
cout<<”Entre com uma frase qualquer, composta de (Sonoda, 2006).
letras maiúsculas, minúsculas e números: “<< endl;
Funções úteis para o uso de strings
getline (cin, frase); No c++ temos duas funções similares na classe string que
letras = frase.size(); são o lenght() e size(). Estas funções não têm argumentos, pois
cout<<”Sua frase tem “<< letras<< “ letras.”<<endl; reportam as informações sobre o objeto a quem pertencem,
for (int i = 0; i < letras; i++) ambas retornam um inteiro que representa o tamanho das
{ strings:
if (isdigit (frase[i])) números++; string s = “Maria Clara”;
if (islower (frase[i])) minúsculas++; cout << s.length(); // mostra: 9
if (isupper (frase[i])) maiúsculas++; cout << s.size(); // também mostra: 9
}
cout<<”Sua frase tem “<< números<< “ Copiando strings
números.”<<endl; Se tentássemos copiar strings desta maneira:
cout<<”Sua frase tem “<< minúsculas<< “ letras char* target = “Maria Clara”;
minúsculas.”<<endl; char src[80] = “Micaela”;
cout<<”Sua frase tem “<< maiúsculas<< “ letras strcpy (target, src);
maiúsculas.”<<endl; O que acontecia é que era a cópia do endereço de src para
system (“PAUSE > null”); o ponteiro e não os caracteres que estão dentro do vetor.
return 0; No entanto, existe a função strcpy (estilo C) – ela aceita
} dois argumentos.
• O primeiro é para onde vai ser copiada e é passado o
ponteiro desse array (não pode ser uma string literal).
8 - Exemplos de como manipular • O segundo é a frase a ser copiada e pode ser um array,
strings em C++ um ponteiro ou um string literal.
Note que essa operação é muito arriscada visto que,
erase - A função membro erase elimina parte de uma quando criamos target, a quantidade de caracteres que foi
string. Os parâmetros passados para a função são a posição reservada para a string era de 9 caracteres mais o caractere nulo
inicial e o número de caracteres a ser excluído. Veja um no final. Se fizermos uma cópia de uma string com mais de
exemplo de uso abaixo: 9 caracteres para esse endereço, representado por target, ele
#include<iostream> fatalmente causará uma violação de endereço.
using std::cout; Porém, em C++ podemos atribuir o valor de uma variável
using std::endl; para outra da classe string da forma:
using std::cin; string target = “Maria Clara”;
string src = “Micaela”;
#include<string> target = src;
using std::string; Agora, reflitamos no que significam essas operações:
using std::getline; Em primeiro lugar, “string” não é um tipo primitivo de dado,
é uma classe, portanto é um tipo de dado mais “inteligente”.
int main(){ Uma das características dos objetos string é que eles são
string myText; redimensionáveis, ou seja, quando atribuímos a uma string
um dado maior que seu espaço interno de armazenamento ela
cout << “Digite um texto qualquer” << endl; aumenta o seu espaço interno para comportar o novo dado.
getline (cin, myText); Outra característica é que a operação “=” para a string é uma
myText.erase (7, 3); operação de atribuição de conteúdo, de forma que a string
copia a outra quando usamos este operador e não apenas o
cout << myText << endl; ponteiro que referencia o endereço da string.
return 0; Unir strings
} strcat() – (string+concatena-te) – une duas frases. Recebe
2 argumentos, a frase primária – o ponteiro para esse array.
8.1 - Comparando formas de operar char target[80] = “Maria”;
strings em C e C++ char* source= “ Clara”;
Em C, temos diversas funções que são usadas para strcat (target, source);
manipular strings, aqui faremos uma comparação dos modos cout << target; // Mostra “Maria Clara”
55
Deve-se observar que strcat é, potencialmente, uma das com o conteúdo do objeto a qual ela pertence.
rotinas mais perigosas do C, por um motivo bem simples: 3. Comparar uma seção começando em (pos1) do objeto,
a string de destino deve ser pré-dimensionada, e deve ter a qual contém (n1) caracteres, com a “string” de entrada (str2).
espaço suficiente para receber a string de origem. Um pequeno 4. Comparar uma “C-string” apontada por um ponteiro
programa como: (szc), com uma seção começando em (pos1), a qual contém
char target[13] = “Regras do C!”; (n1) caracteres do conteúdo do objeto ao qual ela pertence.
char* source = “ Mas pode dar resultados imprevisíveis”; 5. Comparar uma seção do objeto, iniciada em (pos1)
strcat (target, source); com (n1) caracteres, com uma seção de (str2), iniciada em
Escreverá bytes em regiões da memória que não foram (pos2) com (n2) caracteres.
previamente alocadas para a string. Em c++, esse problema é 6. Comparar uma “C-string” apontada por um ponteiro
resolvido pelo uso de objetos string. (szc) de extensão (n2), com uma seção começando em (pos1),
Ao estilo de c++ podemos fazer: a qual contém (n1) caracteres do conteúdo do objeto a qual
string target = “Regras do C++!\n”; ela pertence.
string source = “Geralmente não dão resultados O resultado é similar ao da função strcmp() em “C”,
imprevisíveis.\n”; retornando uma referência de valor de acordo com o código
target += source; ASCII.
cout << target; // Mostra: Regras do C++! Se estiver comparando duas strings outra opção, ainda
// Geralmente não dão resultados mais natural, é utilizar os operadores de comparação < e ==.
Isso porque a classe string prevê o uso do operador “+=” using namespace std;
de concatenação e nele está embutido um código de verificação
de espaço e realocação dele para string, caso seja necessário. string str1 = “check”;
string str2 = “chess”;
Comparar frases, if (str1 == str2)
se fizéssemos: cout << “As palavras são iguais.” << endl;
char str1[80] = “Maria Clara”; else if (str1 < str2)
char str2[80] = “Maria Clara”; cout << “A palavra “ << str1 << “ vem antes de “ <<
if (str1 == str2) str2 << endl;
cout << “iguais”; else
else cout << “A palavra “ << str1 << “ vem depois de “
cout << “diferentes”; << str2 << endl;
O que acontecia é que estaríamos a comparar os endereços
e não os valores.
Temos a função strcmp (string+compare) (tem 2 9 - Convertendo C-string e número
argumentos, retornar 0 se forem iguais).
char str1[80] = “Maria Clara”;
char str2[80] = “Maria Clara”; No ficheiro (arquivo) cabeçalho da biblioteca cstdlib
if (!strcmp (str1, str2)) (c+std+lib) temos várias funções de conversão de números
cout << “iguais”; em tipo numérico.
else atoi (acrônimo para “ASCII to integer”) recebe um
cout << “diferentes” argumento – c-string) e retorna o inteiro que a c-string
representa. Não verifica se o argumento pode ser convertido:
Em C++ podemos comparar duas strings através da int num = atoi (“7654”);
função membro da classe string: compare(), existem os
seguintes formatos (assinaturas) para a função: Programa exemplo:
int compare ( const string& str2 ) const; #include <iostream>
int compare ( const char* szc ) const; #include <cstdlib> // necessário para atoi
int compare ( size_t pos1, size_t n1, const string& str2 #include <cstring>
) const;
int compare ( size_t pos1, size_t n1, const char* szc) using namespace std;
const;
int compare ( size_t pos1, size_t n1, const string& str2, int main(void)
size_t pos2, size_t n2 ) const; {
int compare ( size_t pos1, size_t n1, const char* szc, char input[80];
size_t n2) const; int num;
A função permite os seguintes modos de operação, cout << “Enter an integer: “;
respectivamente: cin >> input;
1. Comparar uma “string” de entrada (str2) com o for (int x = 0; x < strlen (input); x++)
conteúdo do objeto ao qual ela pertence. {
2. Comparar uma “C-string” apontada por um ponteiro if (x == 0)
Linguagem da Programação I 56
{ temos um tipo que representa esse vetor e nos traz uma gama
if (!isdigit (input[x]) && input[x] != ‘-’) de possibilidades, através de funções prontas do tipo string.
return 1; O C++ assim como todas outras linguagens apresenta o tipo
} string para facilitar a nossa programação.
else
{
if (!isdigit(input[x])) Vale a pena
return 2;
}
}
num = atoi(input);
cout << num; Vale a pena ler
#ifdef WIN32
CARVALHO, Flávia PEREIRA de; Apostila de
system (“pause”);
Programação II- Linguagem de Programação C, Faculdade de
#endif
Informática de Taquara, Curso de Sistemas de Informação
2008.
return 0;
JAMSA, Kris; KLANDERM LARS; SANTOS, Jeremias
}
René D. Pereira dos. Programando em C/C++: a bíblia. São
Nesse exemplo temos a vantagem de o usuário inserir
Paulo: Makron Books do Brasil, 1999.
um dígito para o array de caracteres em vez de um inteiro, para
DELGADO, Armando Luiz; Linguagem C++; usp;
evitar um “run-time error” ou “garbage data” que aconteceria
2012.
se a entrada fosse não numérica. Depois o array é verificado
NORTON, Peter; COSTA FILHO, Geraldo; AITKEN,
para ver se representa um número. Se o número for negativo
Peter. et al. A Bíblia do programador. Rio de Janeiro: Campus,
tem o caractere “–”.
1994.
Em C++ usamos objetos da classe stringstream
(biblioteca sstream.h) para armazenar temporariamente os
caracteres, depois usamos o operador “>>” para converter
os caracteres em número, bastando para isso criar a variável
no formato que desejamos receber o número. Mais uma vez
temos o uso do polimorfismo para resolução de um problema Vale a pena acessar
comum de programação, a operação do “>>” é diferente
para cada tipo de dado, selecionada automaticamente pelo Disponível em: <http://www.dainf.ct.utfpr.edu.
compilador de acordo com o tipo de dado da variável destino. br/~pbueno/Arquivos/Algoritmos.pdf>. Acesso em: 26 de
string name = “123”; nov. 2017.
stringstream sst; Disponível em: <https://pt.wikibooks.org/wiki/
int i; Programar_em_C%2B%2B/Manipulando_strings>.
sst << name << endl; Acesso em: 26 de nov. 2017.
sst >> i; Disponível em: <http://www.cplusplus.com/
Os passos acima armazenam o valor 123 na variável “i”, reference/string/string/>. Acesso em: 26 de nov. 2017.
todo processo de conversão é feito pelo operador “>>”.

Retomando a aula

Vale a pena assistir


Parece que estamos indo bem. Então, para encerrar
esta aula, vamos recordar: Programar em C - Introdução Strings | Vetores de
Caracteres. Disponível em: <https://www.youtube.com/
Como vimos anteriormente, um vetor é um tipo de watch?v=YaoW-c6pGTg>. Acesso em: 26 de nov. 2017.
dado capaz de armazenar vários valores. A declaração de C++ - Tratamento de Strings #23. Disponível em:
um vetor pode ser de qualquer tipo, seja número ou carácter. <https://www.youtube.com/watch?v=raQq3Mhcq7o>.
No entanto, são raras vezes que necessitamos de um único Acesso em: 26 de nov. 2017.
carácter, geralmente precisamos de um conjunto, por
exemplo, a leitura de um nome. Nesse caso não precisamos
de um char e sim de um conjunto de char[], dessa forma surge
o conceito de strings. Vimos também que na linguagem C,
realmente declaramos como um vetor de carácter e no C++
57
TREVELIN, Enrique Camargo. Apostila de C++;
Referências UNIESP; 2007.
FILHO, Cláudio Rogério Carvalho. Operadores Lógicos Do
C++; excript; 2015.
DEITEL H.M DEITEL, P.J. C++: Como Programar.
Prentice-Hall, Inc., 5 a edition, 2012. Minhas anotações
STANLEY B. LIPPMAN. C++ Primer. Addison-Wesley
Publishing Company, 1991. ISBN: 0-201-54848-8.
VICTORINE Viviane Mizrahi. Treinamento em Linguagem
C++. Prentice-Hall, Inc., 2 a edition, 2005.
WALTER Savitch. C++ Absoluto. Addison-Wesley
Publishing Company, 2004. ISBN: 85-88639-09-2.
BJARNE Stroustrup. A Linguagem de Programação C++.
Bookman, 2000.
DAVIS, Stephen R. Começando a programar em C++ para
leigos. Rio de Janeiro: Alta Books, 2015.
ELLIS, Margaret A.; STROUSTRUP, Bjarne. C++,
Manual de Referência Comentado. Editora Campus, 1993.
VICTORINE Viviane Mizrahi; Treinamento em Linguagem
C++ (Módulos 1 e 2). Makron Books Editora Ltda. São Paulo,
1994.
NORTON, Peter; COSTA FILHO, Geraldo; AITKEN,
Peter. et al. A Bíblia do programador. Rio de Janeiro: Campus,
1994.
JAMSA, Kris; SANTOS, Jeremias R. D. P. Aprendendo
C++. São Paulo: Makron Books do Brasil, 1999.
JAMSA, Kris; KLANDERM LARS; SANTOS, Jeremias
René D. Pereira dos. Programando em C/C++: a bíblia. São
Paulo: Makron Books do Brasil, 1999.
DELGADO, Armando Luiz; Linguagem C++; usp; 2012.
LAUREANO, Marcos. Programando em C para Linux, Unix
e Windows / Marcos Laureano; Rio de Janeiro: Brasport; 2005.
BUENO, André Duarte; Apostila de Programação
Orientada a Objeto em C++; NÚCLEO DE PESQUISA EM
CONSTRUÇÃO; 2002.
CARVALHO, Flávia Pereira. Linguagem de Programação C;
FIT - Faculdade de Informática de Taquara; 2008.
PINTO, Rossano Pablo. Introdução à Arquitetura e Linguagem
Assembly de Processadores IA-32, Sistemas da Computação; 2007.
ARLEI, Adriano et all; A pré história da computação;
Departamento de Ciência da Computação Informática e
Sociedade; 2006.
DOLORES, Nemora; As 15 principais linguagens de
programação do mundo!; Disponível em: <https://becode.com.
br/principais-linguagens-de-programacao/>. Acesso em:
10/09/ 2017.
CARVALHO, Flávia Pereira. Apostila de Programação II-
Linguagem de Programação C; Faculdade de Informática de
Taquara; 2008.
CARVALHO, Victorio Albani de. Lógica De Programação;
e-tec Brasil Colatina-es 2009.
SONODA, Eloíza; Programação em C; Disponível em:
<https://www.ime.usp.br/~elo/IntroducaoComputacao/>.
Acesso em: 23/06/2017.
Pereira, Fábio Nelson de Sousa; Curso de Linguagem C;
UFMG; 2005.
MACIEL, Fabiano; Iniciando-em-c; Disponível em: <www.
linhadecodigo.com.br/artigo/346/serie-“iniciando-em-c”-
variaveis.aspx>. Acesso em: 04/05/2017.
Linguagem da Programação I 58

Você também pode gostar