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

mellony

Procurar strings

15 mensagens neste tópico

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qual caso específico?

Queres procurar numa string a palavra gato?

Queres procurar num array de strings se alguma tem a palavra gato?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu sei que isto é pedir muito, mas podias fazer o codigo fonte sff :-[

Estou um bocado atrapalhado :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
lês cada linha com fgets, guardando a linha lida numa string.

como faço isto?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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");

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

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