Ir ao conteúdo
  • Cadastre-se
Poisoned00

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

Recommended Posts

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

 

Editado por Poisoned00

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente passando ponteiro + 1 como parâmetro do strstr, assim ele vai procurar a partir da posição do ponteiro + 1.

ptr = strstr(ptr + 1, emot[j]); 

Coloque isso dentro de um ciclo que roda enquanto ptr != NULL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


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

Compartilhar este post


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

 

Compartilhar este post


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

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
21 horas atrás, isrnick disse:

Então , esse compilou fez quase tudo conforme , mas ele não consegue encontrar mais de 1 emoticon em casa frase..
 

Compartilhar este post


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

Compartilhar este post


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

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

×