Elabore uma função que receba duas strings como parâmetros e verifique se a segunda string ocorre dentro da primeira. Use aritmética de ponteiros para acessar os caracteres das strings.
Passo 1
Resumo do enunciado: queremos criar uma função em C que receba duas cadeias de caracteres (strings) e retorne se a segunda ocorre em algum lugar dentro da primeira. Vamos usar aritmética de ponteiros (sem usar índice ou array) para percorrer e comparar caracteres.
Passo 2
Entender o algoritmo de busca de substring: basicamente, para cada posição inicial na primeira string, tentamos comparar todos os caracteres da segunda string. Se todos coincidirem até o fim da segunda, encontramos a ocorrência.
Passo 3
Implementar o laço externo: definimos um ponteiro que percorre cada posição da primeira string até encontrar o caractere nulo ‘\0’. Em cada iteração, ele aponta para o possível início de uma correspondência.
Passo 4
Implementar o laço interno: para cada posição de início, criamos dois ponteiros auxiliares – um apontando para a posição atual da primeira string e outro para o começo da segunda. Enquanto os caracteres forem iguais e não chegarmos ao final da segunda string, avançamos ambos os ponteiros.
Passo 5
Condição de sucesso ou falha: se o ponteiro auxiliar da segunda string alcançar o caractere nulo ‘\0’, significa que toda a segunda string foi casada com um trecho da primeira, então retornamos verdadeiro. Se o laço externo terminar sem sucesso, retornamos falso.
Resposta
#include <stdbool.h>
bool contains(const char *s, const char *t) {
// percorre cada possível posição inicial em s
for (const char *p = s; *p != ‘\0’; ++p) {
const char *p1 = p;
const char *p2 = t;
// compara caracteres enquanto forem iguais e não chegar ao fim de t
while (*p2 != ‘\0’ && *p1 == *p2) {
++p1;
++p2;
}
// se chegamos ao fim de t, encontramos a substring
if (*p2 == ‘\0’) {
return true;
}
}
// não encontrou em nenhuma posição
return false;
}
// percorre cada possível posição inicial em s
for (const char *p = s; *p != ‘\0’; ++p) {
const char *p1 = p;
const char *p2 = t;
// compara caracteres enquanto forem iguais e não chegar ao fim de t
while (*p2 != ‘\0’ && *p1 == *p2) {
++p1;
++p2;
}
// se chegamos ao fim de t, encontramos a substring
if (*p2 == ‘\0’) {
return true;
}
}
// não encontrou em nenhuma posição
return false;
}