Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

fo_11

Problema em contar palavra que aparece numa string

Mensagens Recomendadas

fo_11

Alguem consegue descobrir onde está o problema deste programa?

O objectivo é procurar numa string quantas vezes aparece uma certa palavra. o problema que se impõe é que o comparador não está a realizar o seu trabalho, isto é a contar somente quando a da string é igual à palavra que estamos à procura);

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int Comparacao(char*,int,char*);

int main()
{
    FILE *fp;
    char nome[10],*str=NULL,palavra[20],ch;
    int contar=0;
    
    do
     {printf("Inserir nome:");
      gets(nome);
      if((fp=fopen(nome,"r"))==NULL)
        printf("\nImpossivel aceder ficheiro\n");
     }while(fp==NULL);
    
    while((ch=fgetc(fp))!=EOF)
     {str=(char*)realloc(str,++contar*sizeof(char));
      str[contar-1]=ch;
     }
     str[contar]='\0';
    
    printf("Palavra a comparar:");
    rewind(stdin);
    gets(palavra);    
    
    printf("\nA palavra\"%s\"aparece %d vezes na string\n",palavra,Comparacao(str,contar,palavra));
    free(str);
    system("pause");
}


int Comparacao(char *str,int dim,char *palavra_cp)//como faço nesta funçao para não diferenciar maiusculas de minusculas??
{
    int contar=0,i,comparador=0;
    char *palavra=NULL;
    
    for(i=0;i<dim;i++)
     {
      if(str[i]==' ')
       {palavra=(char*)realloc(palavra,++contar*sizeof(char));
        palavra[contar-1]='\0';
        puts(palavra);
        
        if((strcmp(palavra,palavra_cp))==0)//o erro encontrav-se aqui mas já foi corrigido
          ++comparador;
        contar=0;
       }
       
     else
      {palavra=(char*)realloc(palavra,(++contar)*sizeof(char));
       palavra[contar-1]=str[i];
      }
     }
     free(palavra);
     return comparador;
}
      

EDIT: problema encontrador. como faco para o programa não faça a diferenciaçao  entre maiusculas e minusculas?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

O que fazes é dividir a string em N partes onde N é o tamanho da string que queres procurar. Depois utilizas a função strstr. Se for nulo não aumentas o contador se for diferente de nulo aumentas.

Eu não olhei para o teu código porque meteste aqui para as pessoas procurarem. Tens de ser mais especifico.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

OK, peço desculpa.

Modiifcado

Já corrigi o problema que tinha ao inicio agora, o meu problema é a funcao não diferenciar as maiusculas das minusculas...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Imagina que tens a string "Portugal a programar rocks".

E que queres procurar quantas vezes a substring "rocks" aparece. O que fazes é o seguinte:

→ Guardas o tamanho da substring "rocks" que é, neste caso, 5, numa variável N por exemplo.

→ Percorres toda string (principal)

→ Percorres N posições e vais armazenando numa string auxiliar.

→ Utilizas a função strcmp e verificas se é igual à substring.

→ Se for um contador aumenta se não não aumenta.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Obrigado mais uma vez.

Parecem coisas muito basicas mas estou me a iniciar em c e ainda não conheco a maior parte das funcoes existentes na biblioteca

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Aqui está a parte do programa alterado que supostamente  diferencia as maiusculas das minusculas.  O que está de errado?

int Comparacao(char *str,int dim,char *palavra_cp)
{
    int contar=0,i,comparador=0,j;
    char *palavra=NULL, ch;
    
  for(j=0;j<strlen(palavra_cp);j++)//colocar a palavra que queremos que seja comparada em maiusculas
      {ch=toupper(palavra_cp[i]);
       palavra_cp[i]=ch;
      }
         
    
    
    for(i=0;i<dim;i++)
     {if(str[i]==' ')
       {palavra=(char*)realloc(palavra,++contar*sizeof(char));
        palavra[contar-1]='\0';
        
        for(j=0;j<contar;j++)//colocar palavra que se encontrava na string em maiusculas
         {ch=toupper(palavra[i]);
          palavra[i]=ch;
         }
         
        if(strcmp(palavra,palavra_cp)==0)////não diferencia na mesma
          ++comparador;
        contar=0;
       }
       
     else
      {palavra=(char*)realloc(palavra,(++contar)*sizeof(char));
       palavra[contar-1]=str[i];
      }
     }
     
     free(palavra);
     return comparador;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.