Ir para o conteúdo
mellony

Procurar strings

Mensagens Recomendadas

mellony    0
mellony

O Triton deu no topico do aleatorio um link muito bom que tenho estado a explorar e encontrei lá material muito bom.

Mas aqui neste caso especifico não estou muito a perceber o modo de funcionamento.

Eu queria saber como posso por exemplo procurar uma string que contenha por exemplo a palavra "gato".

Podem ajudar?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
conde    0
conde

Se bem me lembro, uma string em C é um array de caracteres. Logo terás de ir procurando letra a letra.

Vais avançar a por cada caractér até encontrares um "g", se encontraste um "g", então vais ver se a seguir tens um "a"... etc....

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mellony    0
mellony

O que eu quero fazer é o seguite:

O programa pede-me para inserir uma palavra qualquer, depois vai ver se ela está algures num determinado ficheiro txt, se estiver não acontece nada..Se NÃO estiver acrescenta essa palavra ao ficheiro.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
Baderous

Abres o ficheiro com fopen, lês cada linha com fgets, guardando a linha lida numa string. Depois usas a função strstr em que os parâmetros serão a string que queres procurar e a string do fgets. Se o resultado for diferente de NULL, quer dizer que a string que queres procurar existe nessa string, caso contrário não existe nessa string. Vais fazendo isto para cada linha, até que encontres a 1ª ocorrência da tal palavra. Mal encontres (resultado do strstr diferente de NULL), para essa operação e escreves a palavra no ficheiro com fprintf.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
Baderous

Já declaraste uma string noutros exemplos teus: char frase[200];

Se olhares para o header da função fgets: http://www.cplusplus.com/reference/clibrary/cstdio/fgets.html vês que ela recebe 3 parâmetros:

- o apontador para a string onde vais guardar o que lês

- o tamanho da string

- o apontador para o ficheiro do qual lês

Para ires lendo todas as linhas, fazes um while em que a condição corresponde a verificar se o resultado do fgets é diferente de NULL (quando for NULL chegaste ao fim do ficheiro).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mellony    0
mellony

Desta vez atrofiei-me mesmo :wallbash:, ajudem pff.

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

main()
{
    FILE *fp1, *fp2;
    int contador=0;
    char pesquisa1[200];
    char pesquisa2[200];
    char * pch; //experiencia
    fp1 = fopen("ficheiro.txt","r");
    fp2 = fopen("ficheiro.txt","a");
    
  
printf("ola, bem vindo ao prototipo de pesquisas em ficheiros\n\n");
gets(pesquisa1);

   fgets(pesquisa2,200,fp1);

   if (strcmp(pesquisa2,pesquisa1)==0)
   printf("\naquilo que inseriste eh igual ao que esta no ficheiro\n\n");    
   
   
   if (strcmp(pesquisa2,pesquisa1)==1)   
   fprintf(fp2,"\n");
   fputs(pesquisa1,fp2);


//pch = strstr (pesquisa1,pesquisa2);
  //puts (frase);
   
   
   
   
   
   
       
   
    
    
    
    
    
    fclose(fp1);
    fclose(fp2);
    

system("pause");

}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
Baderous

Onde é que está o ciclo while para ires lendo linha a linha do ficheiro? Dessa maneira estás a comparar apenas com a 1ª string do ficheiro.

Btw, não precisas de 2 file pointers, basta abrires o ficheiro uma vez para leitura+escrita.

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

#define MAX 100

int main() {
    FILE *fp;
    char str[MAX], pal[MAX];
    char *ptr=NULL;
    printf("Introduza a palavra: ");
    fgets(pal,sizeof(pal),stdin);
    fp = fopen("lol.txt","r+w");
    if (!fp)
       return;
    while (fgets(str,sizeof(str),fp)!=NULL)
          if ((ptr=strstr(str,pal))!=NULL)
             break;
    if (ptr==NULL) 
       fprintf(fp,pal);
    fclose(fp);
    return 0;
}

Primeiro, leio 1 palavra com a função fgets (não uses gets, pode dar problemas de buffer overflow), depois abro o ficheiro para leitura e escrita (r+w) e verifico se abriu com sucesso. Depois faço o tal ciclo while onde vou lendo linha a linha do ficheiro e vou guardando na string str. De cada vez que o faço, uso a função strstr para verificar se nessa linha existe a palavra que quero procurar e guardo o resultado dessa operação num apontador ptr (valor devolvido pela strstr). Se por acaso o ptr der alguma vez diferente de NULL durante a leitura do ficheiro, quer dizer que encontrou a palavra, então aí saio do ciclo com o break (não é a melhor prática mas não tenho tempo para mais). Caso não encontre a palavra, o valor de ptr não vai ser alterado no ciclo, mantendo-se este com o valor de inicialização (NULL). Assim, basta testar se no fim do ciclo o ptr está a NULL e, se estiver, escrevo a palavra no ficheiro.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mellony    0
mellony

Obrigadão :(

E ainda fiquei a saber que pode se meter

fp = fopen("lol.txt","r+w");

Pensei que tivesse que se declarar das duas maneiras...R e W em separado.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

/*...*/
    while (fgets(str,sizeof(str),fp)!=NULL)
          if ((ptr=strstr(str,pal))!=NULL)
             break;
/*...*/

Só tens um possível problema com a tua solução:

Supoe, para tornar a explicação mais fácil, que o MAX é 10.

Ao leres uma linha com "O meu gato é mau." o fgets() vai cortar a linha em duas -- e nenhuma dessas duas linhas tem a palavra "gato".

Primeira leitura: "O meu gat"

Segunda leitura: "o é mau."

Para resolver este problema, eu faria uma de duas coisas. Ou usava malloc() (e amigos) para ler a linha completa para uma string dinâmica, ou, mais provavelmente, quando a linha lida pelo fgets não fosse completa, guardava alguns caracteres da leitura anterior e lia mais um bocado com novo fgets() e comparava ...

Agora já é tarde para alindar a implementação que fiz ... amanhã meto-a aqui.

Partilhar esta mensagem


Link 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