Implemente a seguinte função:

char *strrchr(char *s, char ch)

que retorna o endereço da última ocorrência de ch em s; caso não exista, retorna NULL. (Note que é o endereço, e não o índice.)

Escreva ainda um programa que solicite um nome completo e escreva na tela apenas o sobrenome.

Passo 1

Fala aí! Vamos começar escrevendo essa função e depois aproveitá-la pra fazer o programa que nos foi pedido. Se liga, começamos declarando as variáveis:

Vamos utilizar i como um índice para percorrer pela string e *ptr será o ponteiro responsável por apontar o endereço que queremos, já o declaramos apontando para NULL pois esse será nosso default, ou seja, é isso que ele vai retornar caso as condições a seguir não forem satisfeitas. Em seguida, passamos para um laço for para percorrer pela string, da seguinte forma:

Já também abrimos uma condição if, que verifica se o caractere str[i] corresponde a um caractere pré-determinado ch. Caso isso ocorra, mandamos ptr guardar o endereço de str[i].

Para finalizar, basta retornar ptr, para que possamos receber este valor quando chamarmos a função lá no main.

A função completa ficou assim:

Passo 2

Agora, vamos passar para a função principal, na qual vamos solicitar um nome completo e usar a função anterior para escrever apenas o sobrenome. Novamente, começamos declarando as variáveis:

Nome será onde vamos armazenar o nome completo inserido pelo usuário e sobrenome é o ponteiro que vai receber o valor passado por ptr. Prosseguimos da seguinte forma:

Pedimos para que o usuário forneça um nome de entrada e, em seguida, chamamos nossa função strrchr passando-o como um dos parâmetros. Agora, por que passamos o caractere como o segundo parâmetro? Ora, se queremos imprimir somente o último nome, precisamos conhecer a posição em que este nome começa, certo? O jeito mais fácil de fazer isso é percebendo que um nome começa logo após um espaço separando-o do primeiro nome. E é isso que fazemos aqui, basta salvarmos o endereço deste espaço em branco lá no ponteiro ptr e passar essa informação para o ponteiro sobrenome, como fizemos ali na linha 24.

Passo 3

Mas calma que ainda não acabou. Vamos agora abrir uma condição ifelse da seguinte forma:

Aqui, fazemos uma comparação entre sobrenome e o valor NULL. Se isso for verdade, quer dizer que foi inserido pelo usuário um único nome (lembra que definimos, lá no início da nossa função, *ptr = NULL?), aí imprimimos este nome mesmo de volta na tela.

Agora, se sobrenome retornar um valor diferente, quer dizer que nossa função strrchr entrou em ação e retornou o endereço do último caractere . Neste caso, basta mandarmos imprimir o valor agora armazenado em sobrenome.

Ah, antes disso, escrevemos, ali na linha 30, sobrenome++. Fazemos isso porque este cara está apontando para o espaço em branco, e esse caractere não nos interessa, o que queremos mesmo é os caracteres que vem dali em diante, sacou?

Resposta