Como procurar uma palavra em uma frase?

13 respostas
S

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?

13 Respostas

L

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

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

S

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.

L

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…

S

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

L

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

S

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”?

L

E como está o printf?

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

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!");
}

}

L

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);
S

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

L

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

S

Vlw.

L

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…

Criado 21 de abril de 2017
Ultima resposta 22 de abr. de 2017
Respostas 13
Participantes 2