HOWTO · C
Verifique se a string contém substring em C
Este artigo demonstra como verificar se uma string contém substring em C
Nesta página
Para verificar se uma string C terminada em nulo contém uma substring exata, com distinção entre maiúsculas e minúsculas, use strstr de <string.h>. A função retorna um ponteiro para a primeira ocorrência ou NULL quando não há correspondência. Os exemplos abaixo foram executados e exibiram Substring found.; essa mensagem permanece em inglês nos blocos, cujos bytes são preservados.
Verificar se uma string contém uma substring com strstr
Passe a string completa como primeiro argumento e o texto que deseja encontrar como segundo. Verifique diretamente o ponteiro retornado; não o imprima como endereço, pois esse valor depende do processo. strstr é declarada no cabeçalho padrão de C <string.h> e compara os caracteres exatamente, incluindo maiúsculas e minúsculas.
Este programa procura welcome em uma frase e exibe uma mensagem estável indicando se encontrou o texto.
#include <stdio.h>
#include <string.h>
int main(void) {
const char *text = "Hello, welcome to C.";
const char *needle = "welcome";
if (strstr(text, needle) != NULL) {
puts("Substring found.");
} else {
puts("Substring not found.");
}
return 0;
}
Substring found.
O ponteiro retornado aponta para o primeiro caractere correspondente em text, então você pode usá-lo para inspecionar a string ou continuar a busca a partir dessa posição. Um ponteiro diferente de nulo indica que há uma correspondência. Se o texto procurado for "", strstr retorna o início de text; leve esse comportamento padrão em conta se, na sua aplicação, uma busca vazia não deve contar como correspondência.
Procurar uma substring com um loop
Uma busca manual pode deixar explícito como a comparação funciona ou permitir a inclusão de comportamentos específicos da aplicação. A função abaixo recebe duas strings terminadas em nulo e diferentes de nulo; retorna 1 quando encontra o texto procurado e 0 caso contrário. Ela verifica os comprimentos antes de subtraí-los, evitando um underflow de inteiro sem sinal quando o texto procurado é mais longo que a entrada. Uma busca vazia é considerada uma correspondência, assim como em strstr.
#include <stdio.h>
#include <string.h>
int contains_substring(const char *text, const char *needle) {
size_t text_len = strlen(text);
size_t needle_len = strlen(needle);
if (needle_len == 0) {
return 1;
}
if (needle_len > text_len) {
return 0;
}
for (size_t i = 0; i <= text_len - needle_len; ++i) {
size_t j = 0;
while (j < needle_len && text[i + j] == needle[j]) {
++j;
}
if (j == needle_len) {
return 1;
}
}
return 0;
}
int main(void) {
const char *text = "Hello, welcome to C.";
const char *needle = "welcome";
puts(contains_substring(text, needle)
? "Substring found."
: "Substring not found.");
return 0;
}
Substring found.
O loop externo testa cada posição inicial em que todo o texto procurado ainda cabe. O loop interno avança enquanto os caracteres correspondentes forem iguais. Se chegar ao comprimento do texto procurado, a função encontrou uma correspondência completa. Esse método direto é útil para aprender ou personalizar a busca; para correspondências exatas comuns, prefira a função da biblioteca padrão, a menos que haja um motivo para manter sua própria implementação.
Verificar se uma string contém uma substring sem distinguir maiúsculas de minúsculas
A biblioteca padrão de C não define uma função para buscar substrings sem distinguir maiúsculas de minúsculas. Em sistemas GNU, strcasestr faz essa busca e está disponível como extensão GNU. Defina _GNU_SOURCE antes de incluir os cabeçalhos para solicitar sua declaração em sistemas que usam essa macro de teste de recursos. Essa função não faz parte do C padrão portátil; verifique se a plataforma de destino oferece suporte a ela antes de depender desse recurso.
Este exemplo completo usa texto ASCII e mostra a chamada específica do GNU. Ele exibe Substring found.; como o bloco de código é preservado sem alterações, essa mensagem permanece em inglês.
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
int main(void) {
const char *text = "Hello, Welcome to C.";
const char *needle = "welcome";
if (strcasestr(text, needle) != NULL) {
puts("Substring found.");
} else {
puts("Substring not found.");
}
return 0;
}
Substring found.
Em código portátil, implemente a comparação sem distinção entre maiúsculas e minúsculas com uma política explícita para os caracteres, em vez de alterar silenciosamente as strings de entrada. A função tolower pode ajudar com texto processado como bytes, mas seu argumento precisa ser EOF ou representar um valor possível como unsigned char; seu comportamento também depende da localidade C ativa. Essa abordagem, por si só, não implementa a conversão de caixa Unicode. Escolha uma biblioteca e uma política de texto adequadas aos dados que seu programa precisa processar.
Tratar casos de borda e escolher um método
Tanto strstr quanto o loop acima pesquisam strings terminadas em nulo e comparam sequências exatas de caracteres. Se a substring procurada for mais longa que o texto, não haverá correspondência. Se estiver vazia, strstr indica uma correspondência no início, e a implementação com loop acima segue a mesma convenção; adicione uma verificação explícita se sua aplicação precisar de outra regra. O loop exige ponteiros diferentes de nulo, assim como as funções de string padrão exigem argumentos que apontem para strings válidas.
strstr retorna a primeira ocorrência. Para encontrar as seguintes, continue a busca a partir do ponteiro da ocorrência anterior somado ao comprimento da substring, garantindo que ela não esteja vazia para que a próxima busca avance. Se as ocorrências sobrepostas forem relevantes, avance apenas um caractere a partir da ocorrência anterior. A escolha depende de as ocorrências poderem compartilhar caracteres.
Use strstr para a verificação comum de correspondência exata, que diferencia maiúsculas de minúsculas: a função é concisa e faz parte do C padrão. Use um loop manual quando precisar ensinar ou personalizar a comparação, e documente as suposições sobre as entradas. Use strcasestr somente quando a extensão GNU estiver disponível e seu comportamento com bytes e localidade for adequado ao texto. strpbrk não substitui uma busca por substring exata: ela verifica se algum caractere de um conjunto aparece na entrada, o que responde a outra pergunta.