Corrigir letras maiúsculas no nome
Todos os dados do usuário deveriam ser verificados e ajustados conforme a natureza daquele dado. Por exemplo, a escrita correta de um nome envolve ter a primeira letra dos nomes e sobrenomes em maiúsculo. O exercício proposta envolve ajustar o nome informado pelo usuário de forma a obter a escrita padronizada.
Enunciado: elabore um algoritmo que leia o nome completo de uma pessoa e ajuste a escrita de forma que apenas a primeira letra dos nomes e sobrenomes estejam em letra maiúscula.
Para exemplificar, considere o nome escrito da seguinte forma: anA MAriA Souza. A forma padronizada deve ser: Ana Maria Souza.
Para fazer o algoritmo é importante conhecer 3 funções da biblioteca string.h, sendo elas:
- strlen(): função que retorna a quantidade de letras de uma string passada por referência.
- tolower(): função que recebe uma letra e retorna o correspondente dessa letra em minúsculo (se ela era uma letra maiúscula).
- toupper(): função que recebe uma letra e retorna o correspondente maiúsculo dessa letra (se ela era uma letra em minúsculo).
A resolução para o enunciado é mostrada no código abaixo.
Na linha 5 é declarada e inicializada a string com um nome fictício. Observe que, na escrita do nome foram utilizadas letras maiúsculas e minúsculas de forma não convencional para um nome.
Na linha 6 é importante mencionar que declaração len = strlen(nome) é responsável por determinar quantas letras a variável possui. Calculo o tamanho da string com a strlen() para não precisar alterar o valor da variável toda vez que alterar o nome na declaração na linha 5.
O código das linhas 8-12 é responsável por inicialmente alterar todo o nome para deixar toda a escrita em letras minúsculas. Para isso são alteradas todas a letras da string para seu correspondente em minúsculo. O que já escrito em minúsculo continua em minúsculo e o que estava em maiúsculo é alterado para a letra em minúsculo.
A linha 15 é utilizada para alterar a primeira letra do nome para maiúsculo. Como o primeira letra já foi padronizada, observe que o laço for da linha 17 inicia com o valor de i=1, pulando essa primeira letra na análise (ela já está correta).
O código das linhas 17-22 é que faz a padronização final. É considerado que, entre os nomes e sobrenomes existe um espaço em branco. Com isso, esse trecho de código busca por um caractere de espaço em branco e, cada vez que localiza esse espaço, faz com que a próxima letra após o espaço seja transformada para maiúsculo. O incremento realizado na linha 20 faz com que, uma vez que a letra após o espaço já foi padronizada, não é necessário avaliar mais uma vez essa letra verificando se é um espaço em branco. Sendo assim, esse incremento é para diminuir a quantidade de letras que precisam ser avaliadas.
#include <stdio.h>
#include <string.h>
int main() {
char nome[] = "ben gRa moR";
int i, len = strlen(nome);
//retira as letras maiúsculas
for (i=0; i<len; i++) {
nome[i] = tolower(nome[i]);
}
printf("Nome todo em minúsculo: %s\n", nome);
//adiciona as letras maiúsculas
nome[0] = toupper(nome[0]);
for (i=1; i<len; i++) {
if (nome[i] == ' ') {
nome[i+1] = toupper(nome[i+1]);
i++;
}
}
printf("Nome padronizado: %s", nome);
}
O incremento feito na linha 20 faz com que o laço de repetição não avalie a próxima letra já que ela não será um caractere em branco. Isso porque foi considerado que o nome está escrito com o espaçamento correto (um espaço em branco separando nomes e sobrenomes). Se não existe essa certeza, o melhor é dispensar o uso de incremento.
Teste o código em: https://ideone.com/FF96TO