Ir ao conteúdo
  • Cadastre-se

C Problema : Encontrar 'n' emoticons em 'm' textos


Poisoned00

Posts recomendados

Olá galera!

Estou tendo um dificuldades pra solucionar esse problema.. a ideia principal do código é receber n números de emoticons e m textos , e então procurar os emoticons nos textos

e contar quantas vezes eles aparecem..

o código está funcional pro caso do  usuário que entrar apenas 1 emoticon por texto.. logo , se entrar  2 ou mais , ele irá contar como apenas 1..
Estou tendo dificuldade com isso , por envolver "vetor de string" , alguém pode me ajudar ? 

#include <stdio.h>
#include <string.h>
#define MAX 100
#define MIN 0 
#define START 1

int main(int argc, char **argv)
{
	char *ptr,emot[MAX][20],text[MAX][80];
	int n,m,cont;
	int len;
	cont = MIN ;
	n=m=START;
	
	fflush(NULL);
	
	while(n != MIN && m != MIN) // esse loop é apenas para que 0 seja o critério de parada
	{
		scanf("%d",&n);
		scanf("%d",&m);
		fflush(NULL);
		for (int i = 0; i <= n; i++)
		{
			fgets(emot[i],MAX,stdin);
		}
		
		for (int k = 0; k < m; k++)
		{
			
			fgets(text[k],MAX,stdin);
			
			for (int j = 1; j <=n; j++)
			{
				ptr = strstr(text[k],emot[j]); 
              /* a minha ideia de solucionar começa aqui , utilizei a função
              * strstr que direciona o ponteiro para a primeira posição a 			
              * qual foi encontrada a substring dentro da string  
              * porém ele procura apenas 1 vez portanto , se tiver mais  
			  * emoticons dentro da string , ele não irá encontrar.. 
              */
                if(ptr!=NULL) 
				{
					cont ++;
				}
			}
		}
		
		printf("%d\n",cont);
		cont=0;
	}
	
	return 0;
}

 

Link para o comentário
Compartilhar em outros sites

8 minutos atrás, Poisoned00 disse:

bah mano não funcionou :/ 
deu Crash quando vou começar a passar os textos.. 
 

 

Posta o código como está para vermos o que pode ser o problema.

 

Mas o primeiro strstr tem que ser como já está:

ptr = strstr(text[k],emot[j]);

Só a partir do segundo usa o ponteiro + 1 no strstr...

Link para o comentário
Compartilhar em outros sites

#include <stdio.h>
#include <string.h>
#define MAX 100
#define MIN 0 
#define START 1

int main(int argc, char **argv)
{
    char *ptr,emot[MAX][20],text[MAX][80];
    int n,m,cont;
    int len;
    cont = MIN ;
    n=m=START;
    
    fflush(NULL);
    
    while(n != MIN && m != MIN)
    {
        scanf("%d",&n);
        scanf("%d",&m);
        fflush(NULL);
        for (int i = 0; i <= n; i++)
        {
            fgets(emot[i],MAX,stdin);
        }
        
        for (int k = 0; k < m; k++)
        {
            
            fgets(text[k],MAX,stdin);
            
            for (int j = 1; j <=n; j++)
            {
                ptr = strstr(text[k+1],emot[j]); // seria aqui onde adciono ?
                if(ptr!=NULL) 
                {
                    cont ++;
                }
            }
        }
        
        printf("%d\n",cont);
        cont=0;
    }
    
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

Tente este (não testei):

 

#include <stdio.h>
#include <string.h>
#define MAX 100
#define MIN 0
#define START 1

int main(int argc, char **argv)
{
    char *ptr,emot[MAX][20],text[MAX][80];
    int n,m,cont;
    int len;
    cont = MIN ;
    n=m=START;

    fflush(NULL);

    while(n != MIN && m != MIN) // esse loop é apenas para que 0 seja o critério de parada
    {
        scanf("%d",&n);
        scanf("%d",&m);
        fflush(NULL);
        for (int i = 0; i <= n; i++)
        {
            fgets(emot[i],MAX,stdin);
        }

        for (int k = 0; k < m; k++)
        {

            fgets(text[k], MAX, stdin);

            for (int j = 1; j <=n; j++)
            {
                ptr = strstr(text[k],emot[j]); //obtem o primeiro emoticon se existe
                while(ptr != NULL)
                {
                    cont++;
                    ptr = strstr(ptr + 1,emot[j]); //continua procurando a partir do ponto onde parou na frase
                }
            }
        }

        printf("%d\n",cont);
        cont=0;
    }

    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

@Poisoned00  O problema é que o fgets pega o caractere nova linha '\n' no fim da string do emoticon, e tenta encontrar o emoticon considerando esse caractere (ex: digita smile :-) e ele pega a string ":-)\n"), logo só normalmente só vai encontrar emoticons se estiverem no fim da string, então basta remover o '\n' do fim do emoticon capturado pelo fgets.

 

#include <stdio.h>
#include <string.h>
#define MAX 100
#define MIN 0
#define START 1

int main(int argc, char **argv)
{
    char *ptr,emot[MAX][20],text[MAX][80];
    int n,m,cont;
    int len;
    cont = MIN ;
    n=m=START;

    fflush(NULL);

    while(n != MIN && m != MIN) // esse loop C) apenas para que 0 seja o critC)rio de parada
    {
        scanf("%d",&n);
        scanf("%d",&m);
        fflush(NULL);
        for (int i = 0; i <= n; i++)
        {
            fgets(emot[i],MAX,stdin);
            strtok(emot[i], "\n");
        }

        for (int k = 0; k < m; k++)
        {

            fgets(text[k], MAX, stdin);
            strtok(text[k], "\n");

            for (int j = 1; j <=n; j++)
            {
                ptr = strstr(text[k], emot[j]); //obtem o primeiro emoticon se existe
                while(ptr != NULL)
                {
                    cont++;
                    ptr = strstr(ptr + 1, emot[j]); //continua procurando a partir do ponto onde parou na frase
                }
            }
        }

        printf("%d\n",cont);
        cont=0;
    }

    return 0;
}

 

Usei strtok(), mas também poderia fazer:

emot[i][strlen(emot[i]) - 1] = '\0';

para colocar o caractere nulo '\0' no lugar do '\n'.

Link para o comentário
Compartilhar em outros sites

Em 11/07/2018 às 17:27, isrnick disse:

@Poisoned00  O problema é que o fgets pega o caractere nova linha '\n' no fim da string do emoticon, e tenta encontrar o emoticon considerando esse caractere (ex: digita smile :-) e ele pega a string ":-)\n"), logo só normalmente só vai encontrar emoticons se estiverem no fim da string, então basta remover o '\n' do fim do emoticon capturado pelo fgets.

 


#include <stdio.h>
#include <string.h>
#define MAX 100
#define MIN 0
#define START 1

int main(int argc, char **argv)
{
    char *ptr,emot[MAX][20],text[MAX][80];
    int n,m,cont;
    int len;
    cont = MIN ;
    n=m=START;

    fflush(NULL);

    while(n != MIN && m != MIN) // esse loop C) apenas para que 0 seja o critC)rio de parada
    {
        scanf("%d",&n);
        scanf("%d",&m);
        fflush(NULL);
        for (int i = 0; i <= n; i++)
        {
            fgets(emot[i],MAX,stdin);
            strtok(emot[i], "\n");
        }

        for (int k = 0; k < m; k++)
        {

            fgets(text[k], MAX, stdin);
            strtok(text[k], "\n");

            for (int j = 1; j <=n; j++)
            {
                ptr = strstr(text[k], emot[j]); //obtem o primeiro emoticon se existe
                while(ptr != NULL)
                {
                    cont++;
                    ptr = strstr(ptr + 1, emot[j]); //continua procurando a partir do ponto onde parou na frase
                }
            }
        }

        printf("%d\n",cont);
        cont=0;
    }

    return 0;
}

 

Usei strtok(), mas também poderia fazer:


emot[i][strlen(emot[i]) - 1] = '\0';

para colocar o caractere nulo '\0' no lugar do '\n'.

bah que massa não sabia da existência dessa função strtok , agora funcionou 100% muito obrigado pela ajuda!

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

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...