Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
fo_11

Problema em contar palavra que aparece numa string

Recommended Posts

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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
fo_11

sim, esse problema já está resolvido.

Agora o que queria era que a palavra Rock fosse igual à rock? deu para entender?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
Localhost

Não te preocupes. Estamos aqui para ajudar. Qualquer dúvida mete aí.


here since 2009

Share this post


Link to post
Share on other 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;
}

Share this post


Link to post
Share on other sites
Localhost

Tens de fazer palavra[j] = ch;, pelo menos foi este o erro que me chamou atenção.


here since 2009

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.