Ir ao conteúdo
  • Cadastre-se

Achar palavra em uma frase(busca de string em string)


Mayk.hsm

Posts recomendados

Boa tarde, tudo bem?

Estou estudando strings e montei um código para verificar quantas vezes uma palavra aparece em uma frase. Gostaria de saber como vocês fariam um exercício como esse, (obs: não precisa postar o código, pode dizer um assunto para eu estudar ou a forma como vocês pensariam para resolver isso, pois achei meu código muito confuso).

O codigo ficou assim, quem puder dar dicas ou ideias de como resolveriam a mesma coisa, ficaria agradecido.

Obrigado, valeu.

#include <stdio.h>
#include <string.h>

int main(){
	
	char PALAVRA[40],FRASE[40];
	int i,j,quantidade=0,T_FRASE,T_PALAVRA,x=0,aux_i=0;
	
	printf("Digite uma frase\n");
	scanf(" %39[^\n]",&FRASE);
	
	
	printf("Digite uma palavra\n");
	scanf(" %39[^\n]",&PALAVRA);
	
	T_PALAVRA= strlen(PALAVRA); 
	T_FRASE = strlen(FRASE);
	
	for (i=0;i<T_FRASE;i++)//faz verificação de todas as letras da FRASE
	{
		if (PALAVRA[0]==FRASE[i])//compara a primeira letra de PALAVRA com as letras da frase
		{
			aux_i=i;//aux com valor de i
			x=0;//variavel de controle de sequencia
			for(j=0;j<T_PALAVRA;j++)//faz verificação da sequencia da sequencia PALAVRA com a sequencia da FRASE
			{
				
				if(PALAVRA[j]==FRASE[aux_i])//faz contagem da sequencia, para fazer comparação com tamanho
				{
					x++;
									
				}
				
				aux_i++;
			}
			if (x>=T_PALAVRA)//verifica se sequencia da PALAVRA foi encontrada na FRASE
				quantidade++;
		}
		
	}
	
	if (quantidade>=1)
		printf("A frase contem a palavra %d vezes",quantidade);
		else
		printf("A frase NAO contem a palavra");
	return 0;
}

 

Link para o comentário
Compartilhar em outros sites

@Mauro Britivaldo @vangodp

 

Mauro, valeu. Não pensei nessa possibilidade. Vou tentar arrumar meu codigo para corrigir esse erro que você apontou.

Vangodp, obrigado pela sugestão, vou dar uma estudada em "tokens" ou algo referente,  e testar esse comando strstr()  para ver como posso melhorar essa solução.

valeu. 

Link para o comentário
Compartilhar em outros sites

você pode criar uma função que compara dois array de caracter e retorne 0 se forem iguas(bem parecida com strcmp que compara strings), seria mais ou menos assim:

#include <stdio.h>
#include <string.h>

int compStrCChar(string str, char arrayChar[]) // compStrCChar (compara String com char[])
{
    int tam = strlen(str);
  
    //compara caractere por caractere
    for(int i = 0; i < tam; i++)
    // se achar um caractere diferente retorna -1
    if(str[i] != arrayChar[i])
        return -1;
  
    // retorna 0 por serem iguais
    return 0;
}

Você então pode utilizar em um loop e sempre que você achar a primeira letra igual você chama a função

exemplo:

#include <stdio.h>
#include <string.h>

typedef char* string; // eu não lembrei qual blibbioteca linkar então definir aqui

/**
  * Esta função compara uma string com um array de caracteres(char [])
  * retorna 0 se iguais ou -1 para diferentes
  */
int compStrCChar(string str, char arrayChar[]);

int main(void)
{
    string palavra = "teste";
    string frase = "12teste12test12testeteste";
    int qtPalavras = 0;// quantidade de palavras
    int tam = strlen(frase);
    //int comp; // armazena comparação
    
    // busca a palavra dentro da frase e então acrescenta 1 a qtPalavra
    for(int i = 0; i < tam; i++)
    {
        if(palavra[0] == frase[i])
        {
            // se as palavras forem iguais ou seja igual compStrCChar a 0
            //comp = compStrCChar(palavra, &frase[i]);
            if(compStrCChar(palavra, &frase[i]) == 0) // lembrando a string definida pelo usuario primeiro
                qtPalavras++;
        }
    }
    printf("%i\n", qtPalavras);
}


int compStrCChar(string str, char arrayChar[]) // compStrCChar (compara String com char[])
{
    int tam = strlen(str);
  
    //compara caractere por caractere
    for(int i = 0; i < tam; i++)
    // se achar um caractere diferente retorna -1
    if(str[i] != arrayChar[i])
        return -1;
  
    // retorna 0 por serem iguais
    return 0;
}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@daniel.oliveira

Obrigado, tentei entender seu codigo por um bom tempo, mas não consegui compreender ainda. Vou estudar alguns conceitos que eu não sei, e tentar compreender durante a semana. Mas valeu pela colaboração.

 

@Mauro Britivaldo

Criei um if , acho que resolve o problema do plural, apesar de eu não saber se é o jeito mais efetivo. Revendo e aprendendo. valeu

if(PALAVRA[j]==FRASE[aux_i])//faz contagem da sequencia, para fazer comparação com tamanho
		{
			x++;									
		}
			if((FRASE[T_PALAVRA+i]=='s')&&(PALAVRA[T_PALAVRA-1]!='s'))//esse ultimo if que trata dos plurais
				x--;
...

 

Link para o comentário
Compartilhar em outros sites

3 horas atrás, Mayk.hsm disse:

@daniel.oliveira

Obrigado, tentei entender seu codigo por um bom tempo, mas não consegui compreender ainda. Vou estudar alguns conceitos que eu não sei, e tentar compreender durante a semana. Mas valeu pela colaboração.

 

@Mauro Britivaldo

Criei um if , acho que resolve o problema do plural, apesar de eu não saber se é o jeito mais efetivo. Revendo e aprendendo. valeu


if(PALAVRA[j]==FRASE[aux_i])//faz contagem da sequencia, para fazer comparação com tamanho
		{
			x++;									
		}
			if((FRASE[T_PALAVRA+i]=='s')&&(PALAVRA[T_PALAVRA-1]!='s'))//esse ultimo if que trata dos plurais
				x--;
...

 

Em vez de verificar se a próxima letra é 's', você precisa verificar se é um espaço, pois poderia ser diferente de s.

 

Exemplo:

 

//Retorna quatidade de palavras na frase s
int exword(const char *s, char *palavra){
	int i = strlen(s);
	int p = strlen(palavra), ii = 0, pp, qtd = 0;
	
	//Frase
	while(ii < i){
		//Palavra
		for(pp = 0; ii < i && pp < p; ii++){
			if(s[ii] == palavra[pp])//Letra da frase igual
				pp++;
			else //Letra diferente
				pp = 0;
		}
		if(pp == p){
			//<espaco/inicio de frase>palavra<espaco/fim de frase>
			if(((s[ii] == ' ' || s[ii] == '\0') && (s[ii-p-1] == ' ' || ii-p-1 <= 0))) {
				qtd++;
			}
			else pp = 0;//A proxima letra e a ultima da frase nao era espaco
		}
	}
	
	return qtd;//Retorna quantidade de palavras
}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

2 horas atrás, Mayk.hsm disse:

@daniel.oliveira

Obrigado, tentei entender seu codigo por um bom tempo, mas não consegui compreender ainda. Vou estudar alguns conceitos que eu não sei, e tentar compreender durante a semana. Mas valeu pela colaboração.

 

@Mauro Britivaldo

Criei um if , acho que resolve o problema do plural, apesar de eu não saber se é o jeito mais efetivo. Revendo e aprendendo. valeu


if(PALAVRA[j]==FRASE[aux_i])//faz contagem da sequencia, para fazer comparação com tamanho
		{
			x++;									
		}
			if((FRASE[T_PALAVRA+i]=='s')&&(PALAVRA[T_PALAVRA-1]!='s'))//esse ultimo if que trata dos plurais
				x--;
...

 

Eu só queria demonstrar que tais trechos de código você pode transformar em função para além de dividir a tarefa de contruir um programa lhe dará a vantagem de reutilizar o código uma vez criada a função você poderá modificá-la sem alterar o resto do programa.

Link para o comentário
Compartilhar em outros sites

@1freakday  Obrigado, entendi o que você quis dizer. Mas se entendi bem, talvez esse trecho do código não funcione para achar palavras em meio a letras.

Como por exemplo: adfsafovorakovosbananadajr

 

caso eu queira identificar só a palavra ovo, tenho que fazer uma verificação se a próxima letra não é um 's' ... Mas super válido no caso de frases. Identificar se o próximo caracter é um espaço, já facilita. Eu não havia pensado dessa forma, como na frase "Macacos gostam de bananas", essa forma que indicou já resolve. (se entendi seu código errado, por favor fale, aí dou uma olhada melhor)

 

@daniel.oliveira Eu identifiquei que você usou função para fazer a comparação, é que não estudei funções ainda, então estou meio perdido quanto a mexer com os parâmetros. Mas vou tentar dar uma olhada essa semana e voltar nesse seu exemplo, mas pô, valeu, assim já tenho um exemplo para fazer o paralelo e tentar aprender.

Link para o comentário
Compartilhar em outros sites

@Mayk.hsm Entendeu certo, mas se quiser identificar no meio de palavras, apenas alterar a parte de condições:

if(pp == p){
			//<espaco/inicio de frase>palavra<espaco/fim de frase>
			if(((s[ii] == ' ' || s[ii] == '\0') && (s[ii-p-1] == ' ' || ii-p-1 <= 0))) {
				qtd++;
			}
			else pp = 0;//A proxima letra e a ultima da frase nao era espaco
		}
	}
//para
if(pp == p)qtd++;
else pp=0;

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Boa noite

 

@Mayk.hsm

Aqui está minha solução :)

</code>

#include <stdio.h>

int main( void ){
  char text[] = "Macacos gostam de Banana, elefantes gostam de amendoim.";
  char p[] = "amendoim";

  int i  = 0; //! Variável inteira Índice do texto.
  int j  = 0; //! Variável inteira Índice da palavra.
  int t  = 0; //! Variável inteira quantidade de ocorrências de p em text.
  while( text[i] != '\0' ){ //! Laço continuar até que o texto chegue ao fim.
    if( text[i++] == p[j] || (j = 0) )j++;//! Se os caracteres coincidem incrementa.
    //! Se não reinicia se o índice da palavra com j <- 0 dentro operador OU.
    if( p[j] == '\0' )printf( "%d-%s\n", 1+t, p ), j = 0, t++;//! j atingiu o max
    //!de incremento, por tanto, palavra encontrada então imprimi, incrementa o contador e
    //!reinicia o índice da palavra j <- 0.
  }
  printf( "%s%s%s%d%s",//!Imprime o resultado.
         "A palavra /",p,"/ repetiu ", t, " vezes.\n" );
  return 0;
}

Solução usa o mínimo de conhecimento inicial da linguagem, com noções em ARRAYS, loop WHILE e declaração IF mais Operadores lógicos ( == IGUAL, || OU/Alternante) e incremento ++.

:)

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!