Buscar

Strings em C e C++

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 11 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 11 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 11 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Linguagem da Programação I
8º Aula
Strings
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.
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!
49
Seções de estudo
1 - String em C
1 - String em C
2 - Funções de caracteres úteis
3 - Cabeçalho de um programa com strings em C++
4 - Declarando e Inicializando uma String
5 - Leitura e Escrita de Strings na Tela
6 - Operações com Strings
7 - Biblioteca cctype: operações com caracteres
8 - Exemplos de como manipular strings em C++
9 - Convertendo C-string e número
Não falamos até agora de vetores de caracteres, apesar de 
já utilizá-las várias vezes. Um vetor de caracteres é normalmente 
chamada de “string” em linguagem de programação. Em C++, 
existem duas maneiras de se criar e trabalhar com strings. Um 
deles é o método antigo, já utilizado pela linguagem C, de se 
declarar e trabalhar com um vetor de caracteres do mesmo 
modo que trabalhamos com vetores numéricos. O outro 
método é utilizar as facilidades da biblioteca padrão de C++, 
que define um tipo de variável específico para strings, com 
várias operações e funções próprias. Neste guia de estudos 
trabalharemos com as strings do tipo C++, por serem elas mais 
simples e ao mesmo tempo apresentarem mais recursos do que 
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 
diferentemente de simples vetores, strings são “terminados” 
por um caractere “ \0”. Utilize “%s” para ler e imprimir strings 
nas funções scanf e printf. Você pode utilizar strings constantes 
para carregar vetores de caracteres nas suas declarações. Uma 
constante do tipo string é definida por uma sequência de 
caracteres entre aspas duplas (lembre-se de que uma constante 
do tipo char e um caractere entre apostrofes). Para declarar 
uma string, podemos usar o seguinte formato geral:
char nome_da_string [tamanho];
Isso declara um vetor de caracteres (uma string) com 
número de posições igual a tamanho. Note que, como temos 
que reservar um caractere para ser o terminador nulo, temos 
que declarar o comprimento da string como sendo, no mínimo, 
um caractere maior que a maior string que pretendemos 
armazenar. Vamos supor que declaremos uma string de 8 
posições e coloquemos a palavra “casa” nela. Teremos:
C A S A \0
No caso acima, as duas células não usadas têm valores 
indeterminados. Isso acontece porque a linguagem C não 
inicializa variáveis, cabendo ao programador essa tarefa. 
Portanto, as únicas células que são inicializadas são as que 
contêm os caracteres ‘c’, ‘a’, ‘s’, ‘a’ e ‘\0’.
Atenção: Existe um detalhe muito importante quanto à 
leitura de strings pelo teclado. O identificador (nome) de um 
vetor/matriz retorna automaticamente o endereço inicial 
na memória que esse vetor está armazenado. Assim sendo, é 
errado utilizar o operador de endereço (&) junto ao nome do 
vetor (BUENO, 2002).
Por exemplo, quando fazemos referência ao vetor palavra 
do código abaixo, é equivalente a & palavra [0].
#include <stdio.h>
int main () /*Este código possui um ERRO!!! O & no 
scanf do vetor/string*/
{
char sPalavra [100];
printf (“Digite uma palavra: “);
scanf (“%s”, &sPalavra);
printf (“\n\n Você digitou %s”, sPalavra);
return (0);
}
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:
#include <stdio.h>
int main ()
/*Este código ESTA CORRETO!! FOI RETIRADO O 
& no scanf do
vetor/string*/
{
char sPalavra [100];
printf (“Digite uma palavra: “);
scanf (“%s”, sPalavra);
sPalavra
printf (“\n\n Você digitou %s”, sPalavra);
return (0);
}
# Nesse programa acima, o tamanho máximo da string 
em C que você pode entrar é uma string de 99 caracteres.
Funções da biblioteca padrão
A biblioteca padrão fornece várias funções úteis para 
manipular strings. A seguir mostraremos algumas delas. Para 
usá-las, você deve incluir o cabeçalho string.h no início dos 
seus arquivos.
strlen
strlen retorna o tamanho, em caracteres, de uma string 
dada. Na verdade o strlen() procura o terminador de string e 
calcula a distância dele ao início da string. Por exemplo:
char nome [15] = “Maria da Silva”;
int s = strlen (nome);
// s conterá o valor 14
strcpy
strcpy copia o conteúdo de uma string para outra e 
coloca um terminador de string. Sua sintaxe é 
strcpy (destino, origem).
char nome[] = “Clarice Lispector”;
char nome2[] = “Oswald de Andrade”;
strcpy (nome, nome2);
// agora nome conterá “Oswald de Andrade”
Tome cuidado com strcpy(), pois se a string a ser copiada 
for maior que a string de destino, provavelmente você gravará 
dados em lugares indesejados ― um problema conhecido 
como estouro de buffer. Para evitar esse problema, use 
50Linguagem da Programação I
a função strncpy, que recebe um terceiro argumento que 
corresponde ao número máximo de caracteres a serem 
copiados (VICTORINE, 2005). 
char msg[] = “Bom dia!”;
char nome[] = “Maria da Silva”;
strncpy (msg, nome, strlen (msg));
// agora msg conterá “Maria da”
strcat
strcat concatena duas strings, adicionando o conteúdo 
da segunda ao final da primeira, além do terminador (\0). 
Note que a primeira string deve ter espaço suficiente para 
conter a segunda, para que não ocorra um “estouro de 
buffer”. Por exemplo:
char nome [50] = “Maria”;
char sobrenome[] = “ da Silva”;
strcat (nome, sobrenome);
// agora nome contém “Maria da Silva”
Analogamente à função strncpy, existe também a função 
strncat, onde o número máximo de caracteres a serem 
copiados é o terceiro argumento.
strcmp
Se você tentar criar duas strings com o mesmo conteúdo 
e compará-las como faria com números, verá que elas “não 
são iguais”. Isso ocorre porque, na verdade, o que está sendo 
comparado são os endereços de memória onde estão guardadas 
as strings. Para comparar o conteúdo de duas strings, você deve 
usar a função strcmp (ou suas variantes) (VICTORINE, 
2005). 
int strcmp (char *s1, char *s2);
O valor de retorno é:
• menor que zero se s1 for menor que s2;
• igual a zero se s1 e s2 são iguais;
• maior que zero se s1 for maior que s2.
Costuma parecer estranho dizer que uma string é menor 
ou maior que outra; na verdade essa comparação é entre a 
primeira letra que difere nas duas strings. Assim, se tivermos 
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 
s2 é “maior”.
É importante notar que a comparação feita por strcmp 
distingue maiúsculas de minúsculas. Isto é, as strings “ABC” e 
“abc” não são iguais para essa função.
As variantes mais usadas de strcmp são:
• strncmp - compara apenas os n primeiros caracteres 
das duas strings, sendo n um terceiro argumento.
• stricmp - compara duas strings sem distinção entre 
maiúsculas e minúsculas. A sintaxe é igual à de strcmp. Essa 
função não faz parte da biblioteca padrão, mas é comumente 
encontrada como extensão particular de várias delas.
strrchr
strrchr retorna um ponteiro sobre a última ocorrência 
de c de uma string, apontada por s se não retorna NULL . Sua 
sintaxe é strrchr (const char *s, int c).
Exemplo:
char path [50] = “/teste/string”;
char *p = strrchr(path, ‘/’);
*p++;
Printf (“Resultado: %s \n”, p);
memcpy
Sintaxe:
#include <string.h>
void *memcpy (void *dest, const void *srce, size_t n);
Descrição: copiar um bloco de n octetos de srce para dest.
Atenção: 
Se as regiões de srce e dest se sobreporem, o 
comportamento da função é imprevisível.
Valor de retorno: memcpy retorna o valor dedest.
Ex:
#include <stdio.h>
#include <string.h>
int main() {
 int tab[2][5] = { { 1, 2, 3, 4, 5},
 {11, 12, 13, 14, 15} };
 int temp[2][5];
 memcpy (temp, tab, sizeof(tab));
 puts (“Resultado:\n”);
 printf (“temp[1][4] = %d\n”, temp[1][4]);
 return 0;
}
memset
Sintaxe:
#include <string.h>
 void *memset (void *buffer, int c, size_t n);
Descrição: memset inicializa n octetos do buffer com o 
inteiro c.
Valor de retorno: o valor do buffer.
Ex:
#include <stdio.h>
#include <string.h>
int main() {
 char buf[] = “W.I.K.I.”;
 printf (“Buf antes ‘memset’: %s\n”, buf);
sprintf
Descrição: A diferença entre printf e sprintf é que printf 
retorna o resultado para a saída padrão (tela), enquanto sprintf 
retorna o resultado em uma variável. Isso é muito conveniente, 
porque você pode simplesmente digitar a frase que você quer 
ter e sprintf lida com a própria conversão e coloca o resultado 
na string que você deseja (NORTON, 1994). 
Sintaxe:
#include <stdio.h>
 int sprint (char *s, const char *formato, ...);
Ex:
 #include <stdio.h> 
 #include <string.h> 
 
 int main() { 
 char var[256]; 
51
 char sobrenome[] = “Simpson”; 
 char nome[] = “Homer”; 
 
 int idade = 30; 
 
 sprintf (var, “%s %s tem %d anos”, sobrenome, 
nome, idade); 
 
 printf (“Resultado : %s\n”, var); 
 
 return 0; 
 }
2 - Funções de caracteres úteis
As seguintes funções estão no cabeçalho da biblioteca 
<cctype>
toupper() – (to+upper) retorna à maiúscula de uma 
letra. É uma função de um argumento – o caractere. No caso 
do argumento não ser uma letra, a função retorna o mesmo 
caractere que é argumento.
tolower() – (to+lower) o mesmo comportamento que 
toupper(), porém com o resultado em minúscula.
#include <iostream>
 #include <cctype>
 using namespace std;
 int main(void)
 {
 char ch;
 do {
 cout << “Pressionar S ou s para sair, \n qualquer 
outra tecla para continuar: “; 
 cin.get (ch);
 ch = toupper (ch);
 if (ch! = ‘\n’)
 cin.ignore();
 if (ch! = ‘S’)
 cout << “Deseja continuar?\n”;
 else
 cout << “Saindo...”;
 } while (ch! = ‘S’);
#ifdef WIN32
 system (“pause”);
#endif
 return 0;
 }
3 - Cabeçalho de um programa com 
strings em C++
4 - Declarando e Inicializando uma 
String
O modelo de string declarado como vetor apresentado 
acima é o estilo de strings usado pela linguagem C pura. Para 
manipular esse tipo de string é preciso ter certo cuidado, pois 
o vetor sempre tem um tamanho definido e caso façamos 
um acesso a um endereço fora do vetor, invadiremos outras 
áreas de memória que não temos como definir o que são e, 
portanto poderemos fazer o programa parar de funcionar. 
Em muitos sistemas pode também haver danos aos outros 
programas e até mesmo ao próprio sistema operacional. 
Porém, em sistemas operacionais mais sofisticados como o 
GNU/Linux, que possuem gerenciamento de memória com 
proteção de memória, apenas o programa que causou a falha 
irá parar de funcionar.
Para manipular esse tipo de string a biblioteca padrão da 
linguagem C dispõe de diversas funções.
Vale a pena ler o livro: Programar. Disponível em: 
<https://pt.wikibooks.org/wiki/Programar_em_C>. 
Acesso em: 25 de nov. 2017. 
No estilo C++, como era de se esperar, as strings são 
objetos, eles podem ser criados facilmente através da biblioteca 
padrão referenciada pelo arquivo de cabeçalho <string>. As 
strings são objetos com recursos que permitem manipular 
os seus caracteres com as funcionalidades das funções 
da linguagem C e mais algumas características próprias 
possibilitadas pela orientação a objetos (JAMSA, 1999).
Todo programa que utilize strings deve conter a seguinte 
linha de inclusão em seu cabeçalho:
#include <string>
#include <cstring>
#include <string.h>
Isso faz com que o compilador inclua no programa a 
biblioteca padrão de strings de C++, que contém todas as 
definições do tipo string, assim como as funções e facilidades 
relacionadas a esse tipo. Assim, o cabeçalho de um programa 
típico envolvendo strings será:
#include <iostream>
#include <string>
using namespace std;
A biblioteca C++ possui uma grande quantidade de 
funções que facilitam o uso do tipo string, tais como, separar 
um string, retornar somente uma parte da string e entre 
outros. 
Para saber mais sobre C++, veja os seguintes links: 
<C++ Reference> e <Cpluplus.com>. Acesso em: 25 de 
nov. 2017. 
Declaramos strings da mesma maneira que declaramos 
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;
string sobrenome;
Uma string declarada dessa forma estará vazia até que um 
valor seja atribuído a ela, das maneiras já estudadas: através de 
uma atribuição, ou de uma entrada de dados do usuário, por 
exemplo.
C++ possui uma série de facilidades para a inicialização 
de strings. Cada um desses diferentes métodos é chamado de 
52Linguagem da Programação I
“inicializador” de uma string (Sonoda, 2006). Abaixo serão 
apresentados os quatro principais inicializadores de string():
string s1; - Cria uma string vazia, chamada s1. Esta é a 
inicialização default de uma string: toda string criada dessa forma está 
vazia.
string s2 (s1); - Cria a string s2 como uma cópia de outra string 
(nesse caso, s1).
string s2 (“Esta é uma string literal”); - Cria a string s2 como 
uma cópia da string literal entre os parênteses.
string s2 (x, ‘c’); - Cria a string s2, que contém x cópias do 
caractere entre aspas (no caso, c).
O programa abaixo exemplifica os métodos descritos 
acima:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string vazia;
string ditado (“Casa de ferreiro, espeto de pau”);
string cópia_ditado (ditado);
string letra_z ( 42, ‘z’);
cout <<”Mostrando o conteúdo da string ‘vazia’:”<< 
endl;
cout << vazia;
cout <<”Mostrando o conteúdo da string ‘ditado’:”<< 
endl;
cout << ditado;
cout <<”Mostrando o conteúdo da string ‘cópia_
ditado’:”<< endl;
cout << cópia_ditado;
cout <<”Mostrando o conteúdo da string ‘letra_z’:”<< 
endl;
cout << letra_z;
system (“PAUSE > null”);
return 0;
}
5 - Leitura e Escrita de Strings na Tela
Utilizamos cin e cout para ler e escrever strings, assim 
como fazemos com variáveis simples. Basicamente, cin e cout 
tratam strings como se fossem variáveis simples, facilitando 
sua manipulação e seu uso em programas.
Já vimos no programa exemplo anterior que utilizamos 
cout para exibir strings inteiras na tela. O cout exibe todos os 
caracteres da string, e detecta automaticamente o fim dela.
Utiliza-se o comando cin para ler strings através do 
teclado. A sintaxe é a seguinte:
cin >> <nome da strin>;
Como já vimos, cin lerá os caracteres inseridos através 
do teclado até encontrar um espaço em branco (tecla barra 
de espaço) ou o fim da entrada (tecla Enter). Quando cin 
encontra um espaço em branco, todos os caracteres após 
este espaço são ignorados. O programa abaixo lê entradas 
do teclado para armazenar o nome e sobrenome do usuário 
dentro de strings.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string nome;
string sobrenome;
cout<<”Digite seu nome: “;
cin >> nome;
cout<<”Digite seu sobrenome: “;
cin >> sobrenome;
cout << “Seu nome é “<<nome<<” e seu sobrenome é 
“<<sobrenome<<”.”<<endl;
system (“PAUSE > null”);
return 0;
}
Esse programa apresenta alguns problemas quando 
o usuário possui mais de um nome ou sobrenome. Por 
exemplo, caso o nome “José Ricardo” seja inserido, a leitura 
do sobrenome será “ignorada” e o programa exibirá “José” 
como o nome e “Ricardo” como sobrenome. Da mesma 
forma, no caso da entrada de um sobrenome duplo, somente o 
primeiro sobrenome é guardado na string “sobrenome”, sendo 
o segundo “ignorado”. Isto acontece por causa da maneira que 
C++ trata os espaços em branco em uma entrada via teclado 
(JAMSA, 1999).Espaços em branco são considerados fim de entrada pelo 
comando cin; ao invés de descartar os caracteres que vierem 
após o espaço em branco, C++ os guarda em um buffer 
(uma espécie de “reserva” ou pilha de dados). Quando cin for 
chamado novamente, antes de ler a nova entrada do teclado, 
o programa primeiro utiliza os dados que estão nesse buffer. 
Assim, temos a impressão que a nova entrada de dados foi 
descartada pelo programa, mas na verdade ela foi jogada no 
buffer, esperando uma nova chamada de cin.
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.
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 
trabalhamos com strings:
getline (cin, <nome da string>);
Assim, esse método recebe todos os caracteres (incluindo 
os espaços em branco) entrados pelo usuário, até que ele aperte 
a tecla Enter. O programa abaixo é uma versão melhorada do 
programa anterior, utilizando o método cin.getline para receber 
os dados desejados.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string nome;
string sobrenome;
cout<<”Digite seu nome: “;
getline (cin, nome);
cout<<”Digite seu sobrenome: “;
53
getline (cin, sobrenome);
cout <<”Seu nome é “<<nome<<” e seu sobrenome é 
“<<sobrenome<<”.”<<endl;
system (“PAUSE > null”);
return 0;
}
6 - Operações com Strings
7 - Biblioteca cctype: operações com 
caracteres
C++ possui uma série de funções e operações próprias 
para strings. A tabela abaixo resume as operações mais utilizadas 
(s é uma string qualquer):
• s.empty ( ) - Função que retorna verdadeiro se a string 
está vazia, e falso caso contrário.
• s.size ( ) - Função que retorna o tamanho em caracteres 
da string.
• s [n] - Acessa um elemento da string. Funciona 
exatamente com um elemento de uma matriz.
• s1 + s2 - Concatena duas strings.
• s1 = s2 - Atribui o conteúdo de s2 na string s1.
• s1 == s2 - Testa a igualdade entre s1 e s2 (retorna 
verdadeiro se as duas strings forem iguais). Duas strings 
são consideradas iguais se elas tiverem o mesmo número de 
caracteres e seus caracteres forem iguais.
A primeira função, <string>.empty indica se uma string 
está vazia ou não. Essa função retorna um valor booleano 
verdadeiro (true ou 1) caso a string esteja vazia, caso contrário 
ela retorna falso (false ou 0).
A função <string>.size é bastante útil para trabalhar 
com strings entradas pelo usuário. Como não podemos saber 
exatamente o número de caracteres entrados pelo usuário, é 
útil ter uma função que nos retorne o tamanho de uma string.
A concatenação de strings é particularmente útil. Quando 
utilizamos o sinal de soma entre duas strings, estamos 
concatenando elas, ou seja, juntando o começo da segunda 
matriz com o final da primeira. Também é possível concatenar 
strings literais (frases entre aspas) junto com as variáveis string 
dessa forma. O programa abaixo ilustra a concatenação de 
strings.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string nome;
string sobrenome;
cout<<”Digite seu nome: “;
getline (cin, nome);
cout<<”Digite seu sobrenome: “;
getline (cin, sobrenome);
string concatena;
concatena = nome + sobrenome;
cout << “O seu nome completo é : “ + nome + “ “ + 
sobrenome << endl;
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 
determinado carácter é uma letra ou um número, se está 
acentuado ou não, se é minúsculo ou maiúsculo, e transformar 
esse caractere. Para utilizar essa biblioteca, precisamos declará-
la no cabeçalho do programa, assim como fizemos com a 
biblioteca de strings. Para declará-la, a sintaxe é a seguinte:
#include <cctype>
Assim, o cabeçalho de um programa que utiliza strings e 
a biblioteca cctype ficaria da seguinte forma:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
Abaixo serão apresentadas algumas das funções mais 
úteis desta biblioteca (x é um elemento de uma string, por 
exemplo, “sobrenome [4]”):
•isalnum (x) - Retorna verdadeiro (1) caso x for uma letra 
ou um número.
•isalpha (x) - Retorna verdadeiro (1) caso x for uma letra.
•iscntrl (x) - Retorna verdadeiro (1) caso x for um dígito 
de controle.
•isdigit (x) - Retorna verdadeiro (1) caso x for um número.
•isgraph (x) - Retorna verdadeiro (1) caso x não for um 
espaço.
•islower (x) - Retorna verdadeiro (1) caso x for uma letra 
minúscula.
•isprint (x) - Retorna verdadeiro (1) caso x for um 
caractere imprimível.
•ispunct (x) - Retorna verdadeiro (1) caso x for um 
caractere acentuado.
•isspace (x) - Retorna verdadeiro (1) caso x for um espaço 
em branco.
•isupper (x) - Retorna verdadeiro (1) caso x for uma letra 
maiúscula
•isxdigit (x) - Retorna verdadeiro (1) caso x for um 
número hexadecimal.
•tolower (x) - Transforma um caractere maiúsculo em 
minúsculo.
•toupper (x) - Transforma um caractere minúsculo em 
maiúsculo.
Com exceção das duas últimas funções que transformam 
caracteres, todas as outras testam os caracteres de uma string, 
retornando valores booleanos (true ou false, 1 ou 0). O 
programa abaixo mostra o uso de algumas dessas funções, 
através da leitura de uma string entrada pelo usuário. Note que 
também é feito o uso da função <string>.size para determinar 
o tamanho da string.
#include <iostream>
#include <string>
using namespace std;
int main()
54Linguagem da Programação I
{
string frase;
int letras = 0, maiúsculas = 0, minúsculas = 0, números 
= 0;
cout<<”Entre com uma frase qualquer, composta de 
letras maiúsculas, minúsculas e números: “<< endl;
getline (cin, frase);
letras = frase.size();
cout<<”Sua frase tem “<< letras<< “ letras.”<<endl;
for (int i = 0; i < letras; i++)
{
if (isdigit (frase[i])) números++;
if (islower (frase[i])) minúsculas++;
if (isupper (frase[i])) maiúsculas++;
}
cout<<”Sua frase tem “<< números<< “ 
números.”<<endl;
cout<<”Sua frase tem “<< minúsculas<< “ letras 
minúsculas.”<<endl;
cout<<”Sua frase tem “<< maiúsculas<< “ letras 
maiúsculas.”<<endl;
system (“PAUSE > null”);
return 0;
}
8 - Exemplos de como manipular 
strings em C++
erase - A função membro erase elimina parte de uma 
string. Os parâmetros passados para a função são a posição 
inicial e o número de caracteres a ser excluído. Veja um 
exemplo de uso abaixo:
#include<iostream>
 using std::cout;
 using std::endl;
 using std::cin;
#include<string>
 using std::string;
 using std::getline;
 int main(){
 string myText;
 cout << “Digite um texto qualquer” << endl;
 getline (cin, myText);
 myText.erase (7, 3);
 cout << myText << endl;
 return 0;
 }
8.1 - Comparando formas de operar 
strings em C e C++
Em C, temos diversas funções que são usadas para 
manipular strings, aqui faremos uma comparação dos modos 
de operar strings em C e C++. Algumas particularidades da 
linguagem C++ permitem uma operação mais intuitiva das 
strings e algumas novas formas de tratá-las. Vejamos como 
manipular esses dados tão comuns em qualquer programa 
(Sonoda, 2006).
Funções úteis para o uso de strings
No c++ temos duas funções similares na classe string que 
são o lenght() e size(). Estas funções não têm argumentos, pois 
reportam as informações sobre o objeto a quem pertencem, 
ambas retornam um inteiro que representa o tamanho das 
strings:
string s = “Maria Clara”;
 cout << s.length(); // mostra: 9
 cout << s.size(); // também mostra: 9
Copiando strings
Se tentássemos copiar strings desta maneira:
char* target = “Maria Clara”;
 char src[80] = “Micaela”;
 strcpy (target, src);
O que acontecia é que era a cópia do endereço de src para 
o ponteiro enão os caracteres que estão dentro do vetor.
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).
• O segundo é a frase a ser copiada e pode ser um array, 
um ponteiro ou um string literal.
Note que essa operação é muito arriscada visto que, 
quando criamos target, a quantidade de caracteres que foi 
reservada para a string era de 9 caracteres mais o caractere nulo 
no final. Se fizermos uma cópia de uma string com mais de 
9 caracteres para esse endereço, representado por target, ele 
fatalmente causará uma violação de endereço.
Porém, em C++ podemos atribuir o valor de uma variável 
para outra da classe string da forma:
string target = “Maria Clara”;
 string src = “Micaela”;
 target = src;
Agora, reflitamos no que significam essas operações: 
Em primeiro lugar, “string” não é um tipo primitivo de dado, 
é uma classe, portanto é um tipo de dado mais “inteligente”. 
Uma das características dos objetos string é que eles são 
redimensionáveis, ou seja, quando atribuímos a uma string 
um dado maior que seu espaço interno de armazenamento ela 
aumenta o seu espaço interno para comportar o novo dado. 
Outra característica é que a operação “=” para a string é uma 
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 
ponteiro que referencia o endereço da string.
Unir strings
strcat() – (string+concatena-te) – une duas frases. Recebe 
2 argumentos, a frase primária – o ponteiro para esse array.
char target[80] = “Maria”;
 char* source= “ Clara”;
 strcat (target, source);
 cout << target; // Mostra “Maria Clara”
55
Deve-se observar que strcat é, potencialmente, uma das 
rotinas mais perigosas do C, por um motivo bem simples: 
a string de destino deve ser pré-dimensionada, e deve ter 
espaço suficiente para receber a string de origem. Um pequeno 
programa como:
char target[13] = “Regras do C!”;
 char* source = “ Mas pode dar resultados imprevisíveis”;
 strcat (target, source);
Escreverá bytes em regiões da memória que não foram 
previamente alocadas para a string. Em c++, esse problema é 
resolvido pelo uso de objetos string.
Ao estilo de c++ podemos fazer:
string target = “Regras do C++!\n”;
 string source = “Geralmente não dão resultados 
imprevisíveis.\n”;
 target += source;
 cout << target; // Mostra: Regras do C++!
 // Geralmente não dão resultados
Isso porque a classe string prevê o uso do operador “+=” 
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.
Comparar frases,
se fizéssemos: 
char str1[80] = “Maria Clara”;
 char str2[80] = “Maria Clara”;
 if (str1 == str2)
 cout << “iguais”;
 else
 cout << “diferentes”;
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 
argumentos, retornar 0 se forem iguais).
char str1[80] = “Maria Clara”;
 char str2[80] = “Maria Clara”;
 if (!strcmp (str1, str2))
 cout << “iguais”;
 else
 cout << “diferentes”
Em C++ podemos comparar duas strings através da 
função membro da classe string: compare(), existem os 
seguintes formatos (assinaturas) para a função:
int compare ( const string& str2 ) const;
int compare ( const char* szc ) const;
int compare ( size_t pos1, size_t n1, const string& str2 
) const;
int compare ( size_t pos1, size_t n1, const char* szc) 
const;
int compare ( size_t pos1, size_t n1, const string& str2, 
size_t pos2, size_t n2 ) const;
int compare ( size_t pos1, size_t n1, const char* szc, 
size_t n2) const;
A função permite os seguintes modos de operação, 
respectivamente:
1. Comparar uma “string” de entrada (str2) com o 
conteúdo do objeto ao qual ela pertence.
2. Comparar uma “C-string” apontada por um ponteiro 
com o conteúdo do objeto a qual ela pertence.
3. Comparar uma seção começando em (pos1) do objeto, 
a qual contém (n1) caracteres, com a “string” de entrada (str2).
4. Comparar uma “C-string” apontada por um ponteiro 
(szc), com uma seção começando em (pos1), a qual contém 
(n1) caracteres do conteúdo do objeto ao qual ela pertence.
5. Comparar uma seção do objeto, iniciada em (pos1) 
com (n1) caracteres, com uma seção de (str2), iniciada em 
(pos2) com (n2) caracteres.
6. Comparar uma “C-string” apontada por um ponteiro 
(szc) de extensão (n2), com uma seção começando em (pos1), 
a qual contém (n1) caracteres do conteúdo do objeto a qual 
ela pertence.
O resultado é similar ao da função strcmp() em “C”, 
retornando uma referência de valor de acordo com o código 
ASCII.
Se estiver comparando duas strings outra opção, ainda 
mais natural, é utilizar os operadores de comparação < e ==.
using namespace std;
string str1 = “check”;
string str2 = “chess”;
if (str1 == str2)
 cout << “As palavras são iguais.” << endl; 
else if (str1 < str2) 
 cout << “A palavra “ << str1 << “ vem antes de “ << 
str2 << endl;
else
 cout << “A palavra “ << str1 << “ vem depois de “ 
<< str2 << endl;
9 - Convertendo C-string e número
No ficheiro (arquivo) cabeçalho da biblioteca cstdlib 
(c+std+lib) temos várias funções de conversão de números 
em tipo numérico.
atoi (acrônimo para “ASCII to integer”) recebe um 
argumento – c-string) e retorna o inteiro que a c-string 
representa. Não verifica se o argumento pode ser convertido:
int num = atoi (“7654”);
Programa exemplo:
#include <iostream>
 #include <cstdlib> // necessário para atoi
 #include <cstring>
 using namespace std;
 int main(void)
 {
 char input[80];
 int num;
 cout << “Enter an integer: “;
 cin >> input;
 for (int x = 0; x < strlen (input); x++)
 {
 if (x == 0)
56Linguagem da Programação I
 {
 if (!isdigit (input[x]) && input[x] != ‘-’)
 return 1;
 }
 else 
 {
 if (!isdigit(input[x]))
 return 2;
 }
 }
 num = atoi(input);
 cout << num;
#ifdef WIN32
 system (“pause”);
#endif
 return 0;
 }
Nesse exemplo temos a vantagem de o usuário inserir 
um dígito para o array de caracteres em vez de um inteiro, para 
evitar um “run-time error” ou “garbage data” que aconteceria 
se a entrada fosse não numérica. Depois o array é verificado 
para ver se representa um número. Se o número for negativo 
tem o caractere “–”.
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 
comum de programação, a operação do “>>” é diferente 
para cada tipo de dado, selecionada automaticamente pelo 
compilador de acordo com o tipo de dado da variável destino.
string name = “123”;
 stringstream sst;
 int i;
 sst << name << endl;
 sst >> i;
Os passos acima armazenam o valor 123 na variável “i”, 
todo processo de conversão é feito pelo operador “>>”.
Retomando a aula
Parece que estamos indo bem. Então, para encerrar 
esta aula, vamos recordar:
Como vimos anteriormente, um vetor é um tipo de 
dado capaz de armazenar vários valores. A declaração de 
um vetor pode ser de qualquer tipo, seja número ou carácter. 
No entanto, são raras vezes que necessitamos de um único 
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++ 
temos um tipo que representa esse vetor e nos traz uma gama 
de possibilidades, através de funções prontas do tipo string. 
O C++ assim como todas outras linguagens apresenta o tipo 
string para facilitar a nossa programação.
CARVALHO,Flávia PEREIRA de; Apostila de 
Programação II- Linguagem de Programação C, Faculdade de 
Informática de Taquara, Curso de Sistemas de Informação 
2008.
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.
NORTON, Peter; COSTA FILHO, Geraldo; AITKEN, 
Peter. et al. A Bíblia do programador. Rio de Janeiro: Campus, 
1994.
Vale a pena
Vale a pena ler
Disponível em: <http://www.dainf.ct.utfpr.edu.
br/~pbueno/Arquivos/Algoritmos.pdf>. Acesso em: 26 de 
nov. 2017.
Disponível em: <https://pt.wikibooks.org/wiki/
Programar_em_C%2B%2B/Manipulando_strings>. 
Acesso em: 26 de nov. 2017.
Disponível em: <http://www.cplusplus.com/
reference/string/string/>. Acesso em: 26 de nov. 2017. 
Vale a pena acessar
Programar em C - Introdução Strings | Vetores de 
Caracteres. Disponível em: <https://www.youtube.com/
watch?v=YaoW-c6pGTg>. Acesso em: 26 de nov. 2017.
C++ - Tratamento de Strings #23. Disponível em: 
<https://www.youtube.com/watch?v=raQq3Mhcq7o>. 
Acesso em: 26 de nov. 2017.
Vale a pena assistir
57
Referências
DEITEL H.M DEITEL, P.J. C++: Como Programar. 
Prentice-Hall, Inc., 5 a edition, 2012.
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.
TREVELIN, Enrique Camargo. Apostila de C++; 
UNIESP; 2007.
FILHO, Cláudio Rogério Carvalho. Operadores Lógicos Do 
C++; excript; 2015.
Minhas anotações
58Linguagem da Programação I

Outros materiais