Ir ao conteúdo
  • Cadastre-se
Mayk.hsm

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

Recommended Posts

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;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa Tarde @Mayk.hsm

Eu gostei do seu código, eu acho que mais importante e a solução do problema, porém fiz um teste.

Se você digitar por exemplo: Macacos gostam de bananas. E buscar banana o retorno é positivo, porém a palavra na frase está no plural, Ops e agora????

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

isso pode ser feito de muitas formas. você pode separar por tokens e usar algum contador, ou simplesmente usar strstr() >_<

  • Curtir 1

Compartilhar este post


Link para o post
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. 

Compartilhar este post


Link para o post
Compartilhar em outros sites

strstr() retorna um ponteiro para a primeira ocorrência da palavra buscada(substring) em uma string, se continuar buscando com esse ponteiro que strstr lhe retornou, a cada ocorrência é só fazer contador++.

E strtok você pode encontrar aqui -> http://www.cplusplus.com/reference/cstring/strtok/

 

você pode montar muitas coisas interessantes com essas funções

  • Curtir 2

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Mayk.hsm com isto construirá ainda mais conhecimento, reposte as fazes do código

Compartilhar este post


Link para o post
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--;
...

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Mayk.hsm O espirito é este mesmo!

 

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites
/* strtok example */
#include <stdio.h>
#include <string.h>

int main () {


    char str[] = "Em um ninho de mafagafos havia sete mafagafinhos; quem amafagafar mais mafagafinhos, bom amagafanhador será.";
    char * pch;

    
    pch = strtok ( str, " ,.-" );
    while ( pch != NULL ) {
        if ( strcmp( pch, "mafagafinhos" ) == 0 ){

            printf ( "%s\n", pch );
        
        }
        pch = strtok ( NULL, " ,.-" );
    }
    
    return 0;
}

Eu faria usando tokens >_<. Alguém conhece algo melhor?

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×