Strings

8.1 Strings

Strings são utilizadas para representar sequências de caracteres, como frases, nomes de pessoas, cidades, ruas, países, etc.
O conteúdo deste tópico possui várias informações novas, mas o uso de strings foi empregado desde as primeiras aulas quando se imprimia uma frase com o uso do comando cout. No exemplo a seguir, tudo o que está entre as aspas é uma string, mas é uma string constante.

cout << "Digite sua idade:";

Entretanto, algumas vezes houve a necessidade de se armazenar strings em variáveis como, por exemplo, o nome e o sexo (com as palavras “feminino” ou “masculino” e não simplesmente ‘f ’ ou ‘m’) de uma pessoa. O primeiro passo é a declaração de string, mas não existe um tipo de dado com esse nome. Conhecendo-se a definição apresentada a seguir, pode-se deduzir como é a declaração.

Quando o objetivo é armazenar uma sequência de caracteres deve-se utilizar um vetor do tipo char, onde cada posição recebe um elemento do tipo caractere. Este tipo de vetor possui o nome de string.

Dessa forma, pode-se definir uma string como sendo um vetor de caracteres terminado pelo caractere nulo. O caractere nulo é especificado como ‘\0’ (lê-se “barra zero”).

Exemplo 8.1: Para se declarar um vetor de caracteres podemos utilizar:

char nome[ ] = {'U', 'N', 'I', 'F', 'E', 'I', '\0'};
    ou
char nome[ ] = "UNIFEI";
    ou
char nome[7] = "UNIFEI";

É preciso declarar vetores de caracteres como sendo um caracter mais longo que a maior string que eles devem guardar (devido ao caracter nulo).

Pela declaração realizada, a estrutura do vetor na memória seria a seguinte:
Conteúdo U N I F E I \0
Índice 0 1 2 3 4 5 6

8.2 Funções para manipulação de Strings

A linguagem C/C++ possui funções para manipulação de vetores de caracteres presentes na biblioteca string.h ou cstring. Para consultar funções dessa biblioteca acesse: http://www.cplusplus.com/reference/clibrary/cstring/.

8.2.1 - Função strlen()

Recebe o nome da string como argumento e retorna seu tamanho sem contar com o caractere ‘\0’.
Exemplo 8.2:

char nome[ ] = "UNIFEI";
int tamanho = strlen(nome);

A variável tamanho assume o valor de 6.

Nota: Uma boa prática de programação é armazenar o valor da chamada da função strlen() em uma variável. Por exemplo, veja o código a seguir:

char nome[19] = "Teodomiro Santiago";              
for (int i = 0; i < strlen(nome) ; i++){
        cout<<"\nCaracter n." << i+1 << ": " << nome[i];
}

Para cada repetição do laço for será feita uma chamada à função strlen(), o que consome mais tempo para execução do programa. Porém, em contrapartida temos:
char nome[19] = "Teodomiro Santiago";
 
int tamanho = strlen(nome);
for (int i =0; i < tamanho ; i++){
     cout<<"\nCaracter n." << i+1 << ": " << nome[i];
}

Neste caso, a função strlen() é chamada apenas uma vez, e o retorno é armazenado em uma variável tamanho. Nesse caso, o laço de repetição não executará múltiplas chamadas da função strlen(), melhorando o desempenho do programa.

8.2.2 - Função strcat()

Concatena duas strings (uma no final da outra). Recebe duas strings como argumento e copia a segunda string (origem) no final da primeira (destino), sendo que a segunda string permanece inalterada. Note que a string destino deverá ser grande o suficiente para armazenar a string resultante.

Exemplo 8.3:

char stringDestino[40] = "Prezado Sr. ";
char stringOrigem[] = "Joao Pereira";
 
strcat(stringDestino, stringOrigem);
 
cout << "String Destino: " << stringDestino <<"\n";
cout << "String Origem: "<< stringOrigem;

A saída exibida na tela para o código anterior é:
String Destino: Prezado Sr. Joao Pereira
String Origem: Joao Pereira

8.2.3 - Função strcmp()

Realiza a comparação entre o conteúdo de duas strings. Recebe duas strings como argumento e retorna o valor 0 (zero) caso o conteúdo das duas strings sejam iguais ou um valor diferente de zero, caso conteúdos diferentes.

Exemplo 8.4:

char cor[] = "azul";
char resposta[10];
 
cout << "Qual e a cor do ceu? \n";
gets(resposta);
 
cout << strcmp(cor, resposta);

Caso o usuário insira como resposta azul, o valor impresso na tela será 0, para qualquer outra entrada, o valor na tela será um valor diferente de 0.

8.2.4 - Função strcpy()

Realiza a cópia do conteúdo de uma string para outra string, substituindo o conteúdo da string de destino. Recebe duas strings como argumento e copia a segunda string (origem) na primeira (destino). Note que a string destino deverá ser grande o suficiente para armazenar a string origem.

Exemplo 8.5:

char stringDestino[] = "Prezado Sr. ";
char stringOrigem[] = "Joao Pereira";
 
strcpy(stringDestino, stringOrigem);
 
cout << "String Destino: " << stringDestino <<"\n";
cout << "String Origem: "<< stringOrigem;

A saída exibida na tela para o código anterior é:
String Destino: Joao Pereira
String Origem: Joao Pereira

8.2.5 - Função gets()

Para a leitura de uma string do teclado devemos usar a função gets, que está definida na biblioteca cstdio. Ela captura todos os caracteres digitados, inclusive os espaços em branco, até que seja pressionada a tecla Enter. No Windows você deverá usar a função fflush(stdin) antes de chamar a gets() para limpar o buffer de entrada.

fflush(stdin); // limpa o buffer de entrada
gets (nome_da_string);

Exemplo 8.6:
Faça um programa que leia uma string e imprima os caracteres separadamente na tela.

Código

#include <cstring>
#include <cstdio>
#include <iostream>
using namespace std;
 
int main()
{
    char nome[30];
 
    cout << "Escreva seu nome completo:\n ";
    fflush(stdin); //Limpa o buffer de entrada do teclado
    gets(nome);
 
    int tamanho = strlen(nome);
    for (int i =0; i < tamanho ; i++){
        cout<<"\nCaracter n." << i+1 << ": " << nome[i];
    }
    return 0;
}

Saída da tela

string1.jpg

Nota: No código apresentado no Exemplo 8.6 podemos observar a presença do comando fflush(stdin). Este comando deve sempre preceder o função gets(), isto evita que a função gets() capture entradas não desejadas (lixo) do buffer do teclado.

8.2.6 - Funções strupr() e strlwr()

Geralmente, não temos controle sobre o que o usuário digita na entrada de dados de seu programa. Por exemplo, caso você deseje realizar uma comparação entre a entrada do usuário e a string "brasil", o usuário pode inserir "Brasil", "bRAsil", etc. Para estes casos podemos utilizar as funções strlwr() ou strupr() para converter os caracteres da string em letras minúsculas ou maiúsculas

respectivamente e compara-lá com uma string padrão.
Exemplo 8.7:

#include <iostream>
#include <string.h>
 
using namespace std;
 
int main()
{
    char palavra1[7] = "BrASiL";
    cout << "String antes da conversao: " << palavra1 << endl;
 
    strupr(palavra1);
    cout << "\nString depois da conversao usando funcao strupr(): " << palavra1;
 
    strlwr(palavra1);
    cout << "\nString depois da conversao usando funcao strlwr(): " << palavra1;
 
    return 0;
}

Saída da tela

string2.jpg

8.3 Passando strings como parâmetros para funções

Para passar uma string como parâmetro para uma função utilizamos o mesmo processo aprendido em vetores. Veja o código a seguir:

void imprimeString(char string[])
{
    int tamanho = strlen(string);
    for (int i = 0; i <  tamanho ; i++)
        cout<<"\nCaracter n." << i+1 << ": " << string[i];
}

Exemplo 8.8: Contrua um programa que contenha funções para:
a. Ler uma string
b. Imprimir a string
c. Contar a quantidade de ocorrências da letra 'h' na string
d. Informar qual foi a última letra digitada

#include <iostream>
#include <string.h>
 
using namespace std;
 
void leString(char string[]);
void imprimeString(char string[]);
int contaLetra (char string[], char letra);
char ultimaLetra (char string[]);
 
int main()
{
    char palavra[60];
    leString(palavra);
    imprimeString(palavra);
    cout << "\nQuantidade de letras 'h': " << contaLetra(palavra, 'h');
    cout << "\nUltima letra digitada: " << ultimaLetra(palavra);
 
    return 0;
}
 
void leString(char string[])
{
    cout << "Digite uma string->";
    fflush(stdin);
    gets(string);
}
 
void imprimeString(char string[])
{
    int tamanho = strlen(string);
    for (int i = 0; i < tamanho ; i++)
        cout<<"\nCaracter n." << i + 1 << ": " << string[i];
}
 
int contaLetra (char string[], char letra)
{
    int contador = 0;
    int tamanho = strlen(string);
    for (int i = 0; i < tamanho ; i++)
    {
        if (string[i] == letra)
            contador++;
    }
 
    return contador;
}
 
char ultimaLetra (char string[])
{
    return string[strlen(string)-1];
}

8.4 Exercícios

1. Uma empresa concederá um aumento de salário aos seus funcionários, variável de acordo com o cargo, conforme a tabela a seguir.

Cargo Percentual
Gerente 10%
Engenheiro 20%
Tecnico 30%

Faça um programa que contenha uma função para ler o cargo e o salário de um funcionário, calcule e retorne o valor o novo salário. Se o cargo do funcionário não estiver na tabela, ele deve receber um aumento de 35%.

2. Escreva um programa que leia uma string. Crie uma função que conte quantos caracteres nesta string são iguais a 'a' e os substitua por 'b'. O programa principal deve imprimir o número de caracteres modificados e a string modificada.

3. Faça um programa com uma função que peça ao usuário o nome de um mês. Crie uma segunda função para abreviar o nome do mês copiando em uma outra string seus três primeiros caracteres seguidos de um ponto. Crie uma terceira função que imprima o mês abreviado.

4. Faça um programa que peça ao usuário o nome da cidade onde nasceu e o nome da cidade na qual reside. Faça uma função que verifique se são as mesmas cidades, emitindo as mensagens correspondentes. A seguir, faça uma função que verifique e imprima a quantidade de vogais no nome da segunda cidade, substituindo-as pelo caractere ‘?’. Imprima o nome da segunda cidade alterada.

5. Faça um programa que contenha uma função para verificar se uma palavra é palíndroma, ou seja, que apresenta a mesma grafia quando lida a partir do início ou de trás para frente. Exemplos: AMA, ASA, SOLOS, ARARA.

6. Faça um programa que utilize uma função que inverta uma frase passada pelo usuário. Substitua todas as vogais da frase invertida pelo caractere de ponto de interrogação. Crie uma função que imprima a quantidade de cada vogal e a frase invertida após as substituições. ATENÇÃO: inverter uma string não é imprimir detrás para frente; se desejar, utilize uma string auxiliar.
Exemplo:
Frase passada pelo usuário: FELIZ NATAL!
Frase invertida após as substituições: L?T?N Z?L?F

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License