Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Poisoned00

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

Recommended Posts

Postado (editado)

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






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

×