Como procurar uma palavra em uma frase?

Olá,

Se eu inserir uma frase em um array de char, e depois quiser procurar uma palavra qualquer nessa frase, é possível fazer isso em linguagem C, existe alguma função que resolva isso?

Função strstr localizada no cabeçalho string.h

https://www.tutorialspoint.com/c_standard_library/c_function_strstr.htm

Tenho duas duvidas.

void verificarPalavra(char frase[], char palavra[]){

 char *res;	
 res = strstr(frase, palavra);	
 if(strcmp(res, palavra) >= 0){		
	printf("Contem palavra na frase!");		
 }else{		
	printf("Nao contem palavra na frase!");
 }

}

main(){

  char frase[50] = "Julio Verne - Tres Russos e Tres Ingleses";
  char palavra[10] = "Russos";
  verificarPalavra(frase, palavra);	

}

1 - Pq meu algoritmo não entra no else, caso a condição seja falsa?
2 - Pq meu algoritmo retorna como verdadeiro, caso procure apenas parte de uma palavra? Por exemplo: Se eu procurar por “Rus”, a condição sera verdadeira, entendendo que essa palavra está contida na frase.

Se você ver o tipo de retorno da função, caso a palavra não existe ela retorna NULL, logo seu teste pode ficar…

char *res;
res = strstr(frase, palavra);

if (res != NULL) {
    printf("Contem palavra na frase!");
} else {
    printf("Nao contem palavra na frase");
}

1 - Seu algoritmo não entra no else porque a função strcmp pode retornar 3 valores:

  • negativo caso res seja menor que palavra
  • zero caso res seja igual palavra
  • positivo caso res seja maior que palavra

Como você usou >= 0 ele nunca vai entrar no else…

2 - a função strstr se baseia em caracteres e não palavras fechadas, ou seja, um pequeno trecho se combinar com a frase, será considerado true e o trecho retorna pela função, caso contrário é null como te mostrei acima…

Seria possível fazer com que o código ignora-se todos os caracteres seguintes a palavra encontrada?

Não entendi, a exemplo do Rus, a função strstr não está te atendendo nisso?

Se eu fizer um printf da palavra encontrada, ele ira imprimir toda a frase a partir do conjunto de caracteres encontrados.No caso se eu procurar por “Russos”, o printf irá imprimir:“Russos e Tres Ingleses”;
Ae minha dúvida. Seria possível fazer o código ignorar o restante da frase, depois do “Russos”?

E como está o printf?

if (res != NULL) {
    printf("Contem %s na frase!", palavra);
} else {
    printf("Nao contem %s na frase", palavra);
}

void verificarPalavra(char frase[], char palavra[]){

char *res;

res = strstr(frase, palavra);

if(res != 0){
	
	printf("Contem palavra na frase!");
	printf("%s", res);
	
}else{
	
	printf("Nao contem palavra na frase!");
}

}

Editei o código acima, o melhor seria usar a variável passada como parâmetro certo?

O res serve apenas para identificar que o trecho existe, e além do mais compare com NULL, é uma boa prática ao invés de 0…

E se quiser um destaque na palavra encontrada faça…

printf("Contem \"%s\" na frase!", palavra);

Esse é o problema, se eu procurar apenas parte de uma palavra, a condição sera verdadeira! Tem como impedir isso?

Nesse caso creio não ter muita alternativa, vai ter de “fazer na mão” mesmo…

Vlw.

Cara, fiz um esquema aqui usando strtok e strcmp me baseando pelos espaços na frase, veja se ajuda…

Mas nesse caso, tome cuidado com acentuações e comparar palavras maiusculas com minusculas…

char *token = strtok(frase, " ");
int encontrou = 0;

while (token != NULL) {
    if (strcmp(token, palavra) == 0) {
        encontrou = 1;
        break;
    }
    token = strtok(NULL, " ");
}

if (encontrou) {
    printf("Contem \"%s\" na frase!\n", palavra);
} else {
    printf("Nao contem \"%s\" na frase\n", palavra);
}

No caso se você digitar “Russos” ele encontra, se digitar “Rus” ou “Russo” ele não encontra…