Ir ao conteúdo

Posts recomendados

Postado

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

 

Postado

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.

Postado
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...

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

 

Postado

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

 

Postado
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..
 

Postado

@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'.

Postado
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

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!