Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    16

    Cercare una data frase in un file

    Sto cercando di allenarmi in c, il mio goal è leggere il e controllare se c'è una data frase all'interno. La funzione deve ritornare "found" o "not found" rispettivamente se la data frase è all'interno del file o no.
    Le frasi sono divise dal simbolo "/".

    Esempio di file:
    1,2,3,4/
    car, house, hotel/
    2,age,12/
    1,2/
    1,2,3,5/
    house, car/

    Esempio di frase da cercare:
    1,2/

    La mia idea è quella di prendere la frase ogni volta, metterla in un array(ary[]) e controllare se l'array è uguale a quello della frase data (sentence[]).

    Ho scritto questo codice:

    codice:
    #include <stdio.h>
    
    void main()
    {
        char *sentence;
        FILE *my_file;
        char *ary;
        int size = 500;
        int got;
        int ind=0;
        int rest;
        int found=0;
    
        sentence="1,2";
    
    
        my_file=fopen("File.txt", "r");
    
        if(my_file==NULL)
        {
            printf("I couldn't open the file\n");
        }
        else
        {
            ary = (char*)malloc(500*sizeof(char));
            while((got=fgetc(my_file))!=EOF)
            {
                if(got!='/')
                {
                    ary[ind++]=(char)got;
                }
                else
                {
                    ary[ind++]='\0';
                    rest = compare(sentence,ary);
                    if(rest==0)
                    {
                        found =1;
                        printf("found\n");
                        return;
                    }
                    ind=0;
                    free(ary);
                    ary = (char*)calloc(500, sizeof(char));
                }
            }
            if(found==0) 
            {
                printf("not found\n");
            }
            fclose(my_file);
        }
    }
    
    
    
    
    int compare(char str1[], char str2[])
    {
        int i = 0;
        int risp;
        if(str1>str2 || str1<str2) 
        {
            risp=-1;
        }
        if(str1==str2)
        {
            while(str1[i++]!='\0')
            {
                if(str1[i]!=str2[i]) risp=1;
            }
        }
    
        return risp;
    }
    Compila, ma non funziona.
    Qualcuno mi può aiutare a capire l'errore o a trovare una migliore soluzione per favore?
    Grazie

    P.S.: Avevo provato anche quest'altra versione:

    codice:
    void main()
    {
        char sentence[]="1,2";
        FILE *my_file;
        char string[2000];
        int ind=0;
        int rest;
        int trovato = 0;
        int got;
    
        my_file=fopen("File.txt", "r");
        if(my_file==NULL)
              printf("I couldn't open the file\n");
        else
        {
            string[0]='\0';
            while((got=fgetc(my_file))!=EOF)
            {
                if(got!='/')
                {
                    string[ind++]=(char)got;
                }
                else
                {
                    string[ind++]='\0';
    
                    rest = compare(sentence, string);
                    if(rest==0)
                    {
                        found =1;
                        printf("found\n");
                        return;
                    }
                    ind=0;
    
                    //delete the array
                    int x=0;
                    while(string[x]!='\0')
                    {
                        string[x]='\0';
                        x++;
                    }
    
                }
            }
            if(found==0) printf("not found\n");
    
    
            fclose(my_file);
        }
    }

  2. #2
    Ci sono diversi problemi o potenziali problemi nel tuo codice. Il principale direi che è la funzione compare che hai scritto (quei confronti tra puntatori). E tra l'altro non ti serve nemmeno, dato che per verificare se una stringa (in questo caso sentence[]) è contenuta in un'altra (ary[]) puoi sfruttare la funzione strstr.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Le stringhe non si confrontano con

    str1>str2

    str1<str2

    str1==str2
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4

    Moderazione

    Benvenuto sul forum ; ti ricordo che il linguaggio di riferimento va indicato anche nel titolo come "tag", ora correggo io, in futuro ricordatene.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    16
    Originariamente inviato da ESSE-EFFE
    Ci sono diversi problemi o potenziali problemi nel tuo codice. Il principale direi che è la funzione compare che hai scritto (quei confronti tra puntatori). E tra l'altro non ti serve nemmeno, dato che per verificare se una stringa (in questo caso sentence[]) è contenuta in un'altra (ary[]) puoi sfruttare la funzione strstr.
    Ho cambiato il compare con la funzione che mi hai suggerito strstr e sembrava funzionasse, invece no.
    Quali sono gli altri problemi chi hai trovato?

    Riposto il codice modificato:
    codice:
    void main()
    {
        char sentence[]="1,2";
        FILE *my_file;
        char string[2000];
        int ind=0;
        int rest;
        int trovato = 0;
        int got;
    
        my_file=fopen("File.txt", "r");
        if(my_file==NULL)
              printf("I couldn't open the file\n");
        else
        {
            string[0]='\0';
            while((got=fgetc(my_file))!=EOF)
            {
                if(got!='/')
                {
                    string[ind++]=(char)got;
                }
                else
                {
                    string[ind++]='\0';
    
                    rest = strstr(sentence, string);
                    if(rest==0)
                    {
                        found =1;
                        printf("found\n");
                        return;
                    }
                    ind=0;
    
                    //delete the array
                    int x=0;
                    while(string[x]!='\0')
                    {
                        string[x]='\0';
                        x++;
                    }
    
                }
            }
            if(found==0) printf("not found\n");
            fclose(my_file);
        }
    }

    Originariamente inviato da oregon
    Le stringhe non si confrontano con

    str1>str2

    str1<str2

    str1==str2
    Capito. Grazie per la risposta.

    Originariamente inviato da MItaly
    Benvenuto sul forum ; ti ricordo che il linguaggio di riferimento va indicato anche nel titolo come "tag", ora correggo io, in futuro ricordatene.
    Si, la prossima volta me ne ricorderò. Grazie!

  6. #6
    Originariamente inviato da TIggy
    Ho cambiato il compare con la funzione che mi hai suggerito strstr e sembrava funzionasse, invece no.
    codice:
                    rest = strstr(sentence, string);
                    if(rest==0)
                    {
                        found =1;
                        printf("found\n");
                        return;
                    }
    Ti sei documentato sulla sintassi e sul valore di ritorno della strstr prima di utilizzarla?

    http://www.cplusplus.com/reference/cstring/strstr/

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    16
    Si, hai ragione.
    Ho cambiato in questo modo.

    codice:
    rest = strstr(sentence, string);
                    if(rest!=NULL)
                    {
                        found =1;
                        printf("found\n");
                        return;
                    }
    Ma alla fine ho fatto così grazie ad un aiuto:

    codice:
    /*  Il file contiene la stringa se la prima parte, o quelche altra più avanti neel file è uguale alla stringa."*/
    int contains(FILE *file, char *str) 
    {
        if (feof(file)) return 0;
        if (initial(file, str)) return 1;
        fgetc(file);  
        return contains(file, str);
    }
    int initial(FILE * file, char * str)
    {
        if !(str*)      return 1; 
        if (feof(file)) return 0; 
        char c = fgetc(file);  
        int result = (c == *str)&& initial(file, str++);
        ungetc(c, file);
        return result;
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    16
    Volevo condividere anche una solusione senza ricorsione.
    L'ho fatta da sola, quindi se trovate qualche errore o qualche problema mi farebbe piacere se me lo diceste. Grazie

    codice:
    char c;
    char str[]="1,2/";
    FILE * f;
    int i=0; 
    
    f=fopen("File.txt", "r");
    if (f==NULL) perror ("Error opening file");
    else
    {
       while ((c=(char)fgetc(f)) != EOF) {
          if((c==str[i]))  {
              if (c=='/')
                {
                  printf("FOUND\n");
                  return;
                }
              i++;
          }
          else i=0;
          if(c=='/')
              i=0;
        }
        printf("NOT FOUND\n");
        fclose (f);
      }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.