Manipulando Strings

Ver Todos os Exercícios

Teoria

Introdução

Opa, tudo bem?

Nesse tópico nós vamos abordar com mais detalhes as strings e entender como podemos manipulá-las no nosso código.

Então bora lá!

getLine vs cin

Antes de tudo, vamos compreender melhor o processo de passar uma informação para uma string, analisando um exemplo clássico. Usaremos um código que recebe o nome do usuário e o imprime logo em seguida:

Na linha 11 desse código, nós usamos a função cin para armazenar o que o usuário digitar na string nome. Dessa forma, temos uma saída da seguinte maneira:

Perceba que, embora tenhamos passada o nome “Programador do Responde ai”, o nosso código armazenou apenas a primeira palavra na string. Isso ocorre porque a função cin interpreta o espaço como o final da informação que deve ser armazenada e devemos levar essa limitação em consideração na hora de escrever um código.

Isso pode ser corrigido usando uma função própria da biblioteca string: a função getline. Essa função vai armazenar na string tudo que for passado até uma quebra de linha, o que seria, na prática, quando o usuário apertar a tecla Enter.

Modificando o nosso código, teríamos:

Dessa vez, na linha 11, estamos usando a função getline, que recebe 2 argumentos: o primeiro é a função cin, e o segundo é a string na qual queremos armazenar a informação passada.

Esse novo código nos dá a seguinte saída:

Perceba que agora temos o nome completo armazenado na s t r i n g   n o m e .

String em funções

A relação entre uma string e uma função é bem semelhante ao que já fazemos. Basicamente, podemos passar uma string para uma função da mesma maneira que fazemos com uma variável. Ou seja, podemos declarar a função recebendo o parâmetro string, quando queremos passar para ela uma string ou podemos declarar a função como do tipo string quando queremos que ela retorne uma string.

Vamos analisar o exemplo:

Nesse código, nós criamos a função I m p r i m i r S t r i n g , que basicamente, deve imprimir a string que passamos para ele, como é especificado na linha 16. Isso nos daria a seguinte saída:

Então, podemos compreender o relacionamento das strings com a funções da mesma maneira que as variáveis (como int, float, char) interagem com as funções.

Manipulando uma string

Uma string para o C++ é algo mutável, ou seja, podemos modificá-la ao longo do nosso programa. Nesse contexto, existem algumas maneiras de fazer isso.

Uma delas é modificando um caractere da string. Isso funciona de forma bem semelhante a modificar o valor armazenado em um vetor. Para isso, nós usamos o nome da string e, entre colchetes, a posição do caractere que queremos modificar.

Nesse código, nós iniciamos a s t r i n g   s t r com a seguinte frase: “Eu sou uma String”. Na linha 11, nós acessamos o caractere que está no índice 9 (vale lembrar que os índices iniciam com 0 e vão até o tamanho da string –   1 ) e fazemos ele receber o caractere ‘ 4 ’. Após isso, temos a seguinte saída:

Ou seja, nós modificamos uma letra da frase armazenada. Isso é uma das maneiras de alterarmos uma string.

Uma outra maneira que podemos fazer é concatenando strings, o que pode ser entendido como somando strings. Vamos analisar o seguinte código como exemplo:

Na linha 7, nós declaramos 2 strings e nas linhas 9 até a 10, nós passamos valores para essas strings. Perceba que, para a s t r 1 e a s t r 2 nós passamos duas frases normais. No entanto, na linha 11, nós fazemos a s t r 1 receber os valores das s t r 1 e s t r 2 somados. Para as strings, somar os seus valores significa fazer uma concatenação estre as strings, ou seja, é como se nós juntássemos os seus valores na ordem em que eles são somados.

Nesse caso, para o código acima, nós teríamos essa saída:

Existem diversas outras maneiras de modificarmos uma string, além de podermos comparar strings e localizarmos elementos dentro delas. Podemos fazer essas operações utilizando funções e métodos próprios da biblioteca string.

Mas como são muitos recursos, não vou detalhar cada um aqui e quando você precisar de uma função específica, pode encontrar os detalhes na documentação online dessa biblioteca pesquisando por ‘C++ strings’.

Agora que já temos mais noção de como trabalharmos com as strings, podemos fazer algumas questões para fixarmos melhor esse conteúdo. Então bora lá, estou te esperando!

String em funções

Manipulando uma string

Exercícios Resolvidos

Exercício Resolvido #1

Faça um programa que receba do usuário duas strings e as envie como parâmetros para uma função que retorne essas strings concatenadas. Imprima o retorno dessa função ao final do programa.

Passo 1

Eai, tudo tranquilo?

Nessa questão, vamos precisar fazer uma função que vai tanto receber strings quanto vai retornar uma string. Perceba que a questão propõe apenas que façamos essa função e printemos o seu retorno. Bom, para termos algum contexto no nosso programa, vamos fazer receber o nome e o sobrenome de um usuário, concatena-los e printar o resultado.

Para isso, vamos iniciar incluindo as bibliotecas iostream e string e inicializando a nossa função:

Passo 2

Dentro da função c o n c a t e n a r , nós devemos retornar a junção das duas strings. No contexto que queremos, seria uma boa ideia que essas strings sejam unidas com um espaço entre elas, pois representam o nome e o sobrenome de uma pessoa. Dessa forma, temos:

Passo 3

Agora, dentro da função main, vamos pedir para que o usuário informe o seu nome e o seu sobrenome e vamos armazenar essas informações em strings usando a função g e t l i n e ( ) .

Por fim, basta imprimirmos uma mensagem de boas vindas com a string concatenada:

Resposta

Exercício Resolvido #2

Faça um programa que leia um nome de uma pessoa e imprima este nome invertido.

Ex: Nome = PROGRAMA

Invertido = AMARGORP.

Passo 1

Eai, tudo beleza?

Nessa questão, o que precisamos fazer é armazenar a string invertida em outra string. Para isso, vamos criar uma função chamada I n v e r t e S t r i n g , que vai receber o nome que querermos e irá retorná-lo invertido.

Passo 2

Dentro da função I n v e r t e S t r i n g , vamos criar uma variável t a m , que vai receber o tamanho do nome passado, e uma string que chamaremos de i n v e r t i d o que vai armazenar o nome que enviamos, mas de forma invertida. A princípio, para que não tenhamos problemas com a quantidade de termos na string, vamos fazer a string invertido receber o nome que passamos para a função.

Agora, vamos criar um laço de for para que possamos inverter os caracteres do nome 1 por 1. Para isso, vamos fazer com que a variável do laço de for vá de 0 até t a m - 1 e vamos fazer com que cada termo de i n v e r t i d o receba o termo oposto de s t r . Dessa forma, invertemos a string.

Passo 3

Para finalizarmos, dentro da função main, vamos pedir para usuário digitar um nome. Esse nome será armazenado dentro de uma string que será enviada para a função I n v e r t e S t r i n g e será impresso o nome invertido do usuário:

Resposta

Exercício Resolvido #3

Faça uma função que retorne a posição de um dado caractere dentro de uma string. Essa função deve receber 2 parâmetros, a string e o caractere que deve ser achado nela, e deve retornar o número da posição desse caractere dentro da função.

Passo 1

Eai, tudo beleza?

Nessa questão, nós vamos implementar uma busca simples dentro de uma string. Para isso, vamos precisar ir iterando entre os elementos dessa string até encontrarmos aquele que querermos.

Vamos iniciar o nosso código incluindo a biblioteca string e usando o header para abreviarmos o std. Além disso, vamos declarar a função que apelidaremos de FindChar.

Perceba que declaramos essa função como do tipo int, pois iremos retornar um número que representa a posição do caractere dentro da string.

Passo 2

Dentro da função que criamos, vamos declarar uma variável para armazenar o tamanho da string que passamos para ela. Para isso, é possível usarmos um método que vem incluído dentro da biblioteca string, que seria o lenght. Basicamente, se precisamos saber o tamanho de uma string, basta usarmos o comando:

n o m e _ d a _ s t r i n g . l e n g t h ( )

Esse método nos retorna a quantidade de caractere que a string possui no momento.

Com isso, temos:

Passo 3

Continuando o nosso código, precisamos fazer um laço de for para compararmos cada elemento da string com o caractere que querermos encontrar. É nesse momento que usamos a variável tam para sabermos até qual índice da string nós vamos colocar no for. Lembrando que, os índices dos caracteres da string vão de 0 até t a m - 1 .

Para finalizamos, vamos utilizar o condicional if para compararmos cada termo com a variável letra e, em caso positivo, vamos retornar o valor do índice.

Resposta

Exercício Resolvido #4

Elabore uma função chamada ordenar, ela deve receber duas strings e imprimi-las na tela na ordem alfabética.

OBS: As strings devem possuir apenas letras minúsculas.

Passo 1

Eai, tudo beleza?

Nessa questão, nós vamos ter que comparar duas strings. No C++, podemos comparar strings usando as notações que utilizamos para comparar valores numéricos. Isso é possível pois o que estamos comparando são os valores da tabela ASCII. Ou seja, se usamos “ a ”   >   “ b ” , estamos comparando o valor de ‘a’ com ‘b’ na tabela ASCII, que seria o mesmo de comparar 97 com 98. Ou seja, essa afirmação “ a ”   >   “ b ” , vai nos retornar F A L S E .

Quando comparamos strings maiores, a comparação ocorre termo a termo, ou seja, o primeiro termo é comparado com o primeiro, o segundo com o segundo e assim segue.

Com isso, podemos começar a nossa função.

Passo 2

Vamos iniciar o nosso código incluindo as bibliotecas iostream, para usarmos a função cout, e a biblioteca string. Em seguida vamos declarar a nossa função o r d e n a r como do tipo v o i d , pois só precisamos imprimir valores na tela e não há necessidade de retornar nada. Além disso, vamos colocar duas strings como parâmetros.

Passo 3

A seguir, vamos começar as comparações. Para isso, vamos usar o condicional if para compararmos a s t r 1 com a s t r 2 . Se s t r 1 > s t r 2 for verdade, isso significa que s t r 1 tem maior valor na tabela ASCII. Ou seja, s t r 1 vem depois na ordem alfabética. Caso o contrário, s t r 1 vem primeiro ou elas são a mesma palavra (caso s t r 1 = = s t r 2 ). Com isso, podemos fazer o seguinte condicional:

Resposta

Exercício Resolvido #5

Sistemas com senhas são muito importantes nos dias de hoje. Pensando nisso, faça um programa que pede a senha para o usuário. Se o usuário acertar a senha, ele deve imprimir a mensagem “Senha correta. Seja bem-vindo usuario.”. Se a senha for errada, ele deve imprimir na tela “Senha errada. Tente novamente.”. O usuário pode tentar acertar a senha quantas vezes quiser e o programa só será encerrado se ele acertar a senha.

Passo 1

Eai, tudo beleza?

Nessa questão nós teremos que trabalhar com uma comparação de strings dentro de um loop infinito que só parará se determinadas mensagens forem escritas.

Para iniciarmos o nosso programa, vamos incluir as bibliotecas necessárias e, dentro da main, vamos declarar a string s e n h a , que armazenará a senha que irá destravar o programa, e a string t e n t a t i v a , que armazenará o palpite do usuário.

Nesse caso, escolhemos a senha como sendo “papagaio”.

Passo 2

Vamos iniciar o nosso loop. Como não sabemos a quantidade de vezes que essa rotina será executada, usaremos um w h i l e ( t r u e ) , ou seja, a rotina só irá deixar de ser executada se usarmos o comando b r e a k .

Dentro do w h i l e ( t r u e ) , nós iremos colocar uma mensagem para que o usuário digite a sua tentativa e iremos armazenar esse valor na string t e n t a t i v a .

Passo 3

Agora, vamos colocar os condicionais, começando com o caso dele errando a senha, ou seja, t e n t a t i v a ser diferente de s e n h a :

Em seguida, usaremos o e l s e para representar o caso de igualdade.

Perceba que nesse caso, além da mensagem, nós usamos o comando b r e a k , que serve para encerrar a rotina do w h i l e .

Resposta