Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - comparazione stringhe...
Forum - C/C++ - comparazione stringhe...

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
giocala88 (Normal User)
Expert


Messaggi: 248
Iscritto: 23/04/2008

Segnala al moderatore
Postato alle 18:29
Mercoledì, 18/02/2009
Salve ragazzi, ho un piccolo problema con questo semplice programma.
Questo programma funziona così:
si sceglie da un menù se inserire o ricercare delle stringhe. Fermiamoci sul ricercare le stringhe. Allora inserendo la stringa "ciao", il programma dovrà valutare se tale stringa è presente o meno in un file di testo che verrà aperto.
Il problema è che la comparazione tra stringhe, quella inserita dall'utente e quella presuribilmente presente nel file di testo non avviene..dove sbaglio??...grazie a tutti anticipatamente...


Codice in ANSI C:

/*****************************/
/* inclusione delle librerie */
/*****************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/******************************/
/* definizioni delle costanti */
/******************************/
#define MAX_CLIENTI 10 /* numero massimo di clienti */

typedef struct
{
    char nome_cognome[10];

} Database;


typedef struct
{
    Database vett_clienti[MAX_CLIENTI];
    int nome_cognomeClienti;

} DatabaseClienti;


void leggi_da_file(DatabaseClienti *dat);

int main()
{
    char nome_cognome[10];
    int n;
    DatabaseClienti database;  /* variabile database di tipo struttura */


    printf("\n                - MENU' DI SCELTA -\n");
    printf("\n  [1] Ricerca");
    printf("\n  [2] Inserimento\n");
    printf("\n  Inserire il numero presente in parentesi per selezionare: ");
    scanf("%d", &n);

    printf("\nInserire il nome/cognome da cercare: ");
        scanf("%s", nome_cognome[10]);

    if(n = 1)
    {
        leggi_da_file(&database);
    }


    return 0;
}

/* definizione della funzione per leggere da file */
void leggi_da_file(DatabaseClienti *dat)
{
    FILE *file_clienti;
    dat->nome_cognomeClienti = 0;   /* variabile di tipo puntatore a struttura inizializzata a zero */
    char chiavi_lette[10];
    char nome_cognome[10];
    int cont, i;

        file_clienti = fopen("cliente1.txt", "r);
        /*chiavi_lette[10] =*/ fscanf(file_clienti,"%s", dat->vett_clienti[dat->nome_cognomeClienti].nome_cognome);

        /* ciclo for */
        for (cont = 0; cont < dat->nome_cognomeClienti - 1; cont++)
        {
            for (i = cont + 1; i < dat->nome_cognomeClienti; i++)
            {
                if(strcmp(dat->vett_clienti[cont].nome_cognome, nome_cognome) == 0)
                  printf("Il risultato ha avuto esito positivo");

                else
                printf("Il nome '%s' non ha prodotto alcun risultato", nome_cognome[10]);
            }
        }

    /* chiudi i file */
    fclose(file_clienti);

}




PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 20:20
Mercoledì, 18/02/2009
Intanto queste due righe

   scanf("%s", nome_cognome[10]);

   if(n = 1)

sono sbagliate perche' dovrebbero essere

   scanf("%s", nome_cognome);

   if(n == 1)

e infine, la funzione di ricerca non e' corretta ...

Il file non viene letto completamente (c'e' una sola scanf ...) e quindi il ciclo for successivo non puo' trovare nulla ... inoltre non capisco a cosa serva il secondo for ...

Riflettici un attimo ...

PM Quote
Avatar
giocala88 (Normal User)
Expert


Messaggi: 248
Iscritto: 23/04/2008

Segnala al moderatore
Postato alle 13:11
Venerdì, 20/02/2009
Avevi ragione, ho fatto degli errori che ho revisionato e corretto. Adesso il programma funziona perfettamente ma vorrei capire un'ultima cosa.
Il programma, se selezionata la voce inserisci, chiederà di inserire  nome, cognome e scheda.
Il problema è che quando inserisco dei dati nella voce scheda, questa mi ricopia sul file.txt solo la prima voce.
Es
nome: roberto
cognome: rossi
scheda: nato a milano il 24/06/88...
Nella copiatura sul file txt mi ricopia solo la prima voce, cioè nato...come mai?
Potreste dare un'occhiata e consigliarmi come fare a copiare tutto il testo della voce scheda??...grazie anticipatamente...

Codice AnSI C:
/*****************************/
/* inclusione delle librerie */
/*****************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/******************************/
/* definizioni delle costanti */
/******************************/
#define MAX_CLIENTI 10 /* numero massimo di clienti */

typedef struct
{
    char nome[10],
         cognome[10],
         scheda[10],
         campo_nome[10],
         campo_cognome[10],
         campo_scheda[10000];

} Database;


typedef struct
{
    Database vett_clienti[MAX_CLIENTI];
    int nome_cognomeClienti;

} DatabaseClienti;


void leggi_da_file_inserimento(DatabaseClienti *dat);
void leggi_da_file(DatabaseClienti *dat);
int main()
{
    char nome_cognome[10],
         nome[10],
         cognome[10];
    int n;
    DatabaseClienti database;  /* variabile database di tipo struttura */
    FILE *file_clienti1,
         *file_clienti2,
         *file_clienti3,
         *file_clienti4,
         *file_clienti5,
         *file_clienti6,
         *file_clienti7,
         *file_clienti8,
         *file_clienti9,
         *file_clienti10;


    printf("\n                - MENU' DI SCELTA -\n");
    printf("\n  [1] Ricerca");
    printf("\n  [2] Inserimento\n");
    printf("\n  Inserire il numero presente in parentesi per selezionare: ");
    scanf("%d", &n);
    int leggi_interno_file;

    if(n == 1)
     leggi_da_file(&database);

    else if(n == 2)
      leggi_da_file_inserimento(&database);

    return 0;
}

/* definizione della funzione per leggere da file */
void leggi_da_file_inserimento(DatabaseClienti *dat)
{
    FILE *file_clienti1,
         *file_clienti2,
         *file_clienti3,
         *file_clienti4,
         *file_clienti5,
         *file_clienti6,
         *file_clienti7,
         *file_clienti8,
         *file_clienti9,
         *file_clienti10;
    dat->nome_cognomeClienti = 0;   /* variabile di tipo puntatore a struttura inizializzata a zero */
    int chiavi_lette;
    char nome_cognome[10],
         nome[10],
         cognome[10],
         scheda[10000];

        file_clienti1 = fopen("cliente1.txt", "r");
        file_clienti2 = fopen("cliente2.txt", "r");
        file_clienti3 = fopen("cliente3.txt", "r");
        file_clienti4 = fopen("cliente4.txt", "r");
        file_clienti5 = fopen("cliente5.txt", "r");
        file_clienti6 = fopen("cliente6.txt", "r");
        file_clienti7 = fopen("cliente7.txt", "r");

        if(file_clienti1 == NULL)
        {
            file_clienti1 = fopen("cliente1.txt", "w");

            printf("\n NOME: ");
            scanf("%s", nome);
            printf("\n COGNOME: ");
            scanf("%s", cognome);
            printf("\n SCHEDA: \n");
            scanf("%s", scheda);

            fprintf(file_clienti1, " NOME %5s\n", nome);
            fprintf(file_clienti1, " COGNOME %5s\n", cognome);
            fprintf(file_clienti1, " SCHEDA:\n%s", scheda);

        }
        else if(file_clienti2 == NULL)
        {
            file_clienti2 = fopen("cliente2.txt", "w");

            printf("\nnome: ");
            scanf("%s", nome);
            printf("\ncognome: ");
            scanf("%s", cognome);

            fprintf(file_clienti2, "nome: %5s\n", nome);
            fprintf(file_clienti2, "cognome: %5s\n", cognome);
        }
        else if(file_clienti3 == NULL)
        {
            file_clienti3 = fopen("cliente3.txt", "w");

            printf("\nnome: ");
            scanf("%s", nome);
            printf("\ncognome: ");
            scanf("%s", cognome);

            fprintf(file_clienti3, "nome: %5s\n", nome);
            fprintf(file_clienti3, "cognome: %5s\n", cognome);
        }
        else if(file_clienti4 == NULL)
        {
            file_clienti4 = fopen("cliente4.txt", "w");

            printf("\nnome: ");
            scanf("%s", nome);
            printf("\ncognome: ");
            scanf("%s", cognome);

            fprintf(file_clienti4, "nome: %5s\n", nome);
            fprintf(file_clienti4, "cognome: %5s\n", cognome);
        }
        else if(file_clienti5 == NULL)
        {
            file_clienti5 = fopen("cliente5.txt", "w");

            printf("\nnome: ");
            scanf("%s", nome);
            printf("\ncognome: ");
            scanf("%s", cognome);

            fprintf(file_clienti5, "nome: %5s\n", nome);
            fprintf(file_clienti5, "cognome: %5s\n", cognome);
        }
        else if(file_clienti6 == NULL)
        {
            file_clienti6 = fopen("cliente6.txt", "w");

            printf("\nnome: ");
            scanf("%s", nome);
            printf("\ncognome: ");
            scanf("%s", cognome);

            fprintf(file_clienti6, "nome: %5s\n", nome);
            fprintf(file_clienti6, "cognome: %5s\n", cognome);
        }
        else if(file_clienti7 == NULL)
        {
            file_clienti7 = fopen("cliente7.txt", "w");

            printf("\nnome: ");
            scanf("%s", nome);
            printf("\ncognome: ");
            scanf("%s", cognome);

            fprintf(file_clienti7, "nome: %5s\n", nome);
            fprintf(file_clienti7, "cognome: %5s\n", cognome);
        }
        else
        {
            printf("\n Database pieno:\n");
            printf("\n Memoria insufficiente per memorizzare altri clienti!\n");
        }

    /* chiudi i file */
    fclose(file_clienti1);
    fclose(file_clienti2);
    fclose(file_clienti3);
    fclose(file_clienti4);
    fclose(file_clienti5);
    fclose(file_clienti6);
    fclose(file_clienti7);

}


/* definizione della funzione per leggere da file */
void leggi_da_file(DatabaseClienti *dat)
{
    FILE *file_clienti1,
         *file_clienti2,
         *file_clienti3,
         *file_clienti4,
         *file_clienti5,
         *file_clienti6,
         *file_clienti7;
    dat->nome_cognomeClienti = 0;   /* variabile di tipo puntatore a struttura inizializzata a zero */
    char nome_cognome[10], modifica;
    int cont, chiavi_lette, i;

        file_clienti1 = fopen("cliente1.txt", "r");
        file_clienti2 = fopen("cliente2.txt", "r");
        file_clienti3 = fopen("cliente3.txt", "r");
        file_clienti4 = fopen("cliente4.txt", "r");
        file_clienti5 = fopen("cliente5.txt", "r");
        file_clienti6 = fopen("cliente6.txt", "r");
        file_clienti7 = fopen("cliente7.txt", "r");

        printf("\n Inserire il nome/cognome da cercare: ");
        scanf("%s", nome_cognome);

       if(file_clienti1 != NULL){
           fscanf(file_clienti1,"%s %s %s %s", dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].nome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].cognome);

           if(strcmp(dat->vett_clienti[dat->nome_cognomeClienti].nome, nome_cognome)    == 0 ||
              strcmp(dat->vett_clienti[dat->nome_cognomeClienti].cognome, nome_cognome) == 0)
              {
                  printf("\n cliente1.txt: Nome o cognome presente");
                  printf(" \n %s: %s\n %s: %s\n",dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].nome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].cognome);

                /*  printf("\n Vuoi modificare il documento? [Y/N]\n");
                  scanf("%c", &modifica);
                  if(modifica == 'Y' ||
                     modifica == 'y')
                     {
                  */
              }
              else
                printf("\n cliente1.txt: Nome o cognome non presente");
       }

       if(file_clienti2 != NULL){
           fscanf(file_clienti2,"%s %s %s %s", dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].nome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].cognome);

           if(strcmp(dat->vett_clienti[dat->nome_cognomeClienti].nome, nome_cognome)    == 0 ||
              strcmp(dat->vett_clienti[dat->nome_cognomeClienti].cognome, nome_cognome) == 0)
              {
                  printf("\n cliente2.txt: Nome o cognome presente");

                  printf(" \n %s: %s\n %s: %s\n",dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].nome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].cognome);
              }
              else
                printf("\n cliente2.txt: Nome o cognome non presente");
       }

       if(file_clienti3 != NULL){
           fscanf(file_clienti3,"%s %s %s %s", dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].nome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].cognome);

           if(strcmp(dat->vett_clienti[dat->nome_cognomeClienti].nome, nome_cognome)    == 0 ||
              strcmp(dat->vett_clienti[dat->nome_cognomeClienti].cognome, nome_cognome) == 0)
              {
                  printf("\n cliente3.txt: Nome o cognome presente");

                  printf(" \n %s: %s\n %s: %s\n",dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].nome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].cognome);
              }
              else
                printf("\n cliente3.txt: Nome o cognome non presente");
       }

       if(file_clienti4 != NULL){
           fscanf(file_clienti4,"%s %s %s %s", dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].nome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].cognome);

           if(strcmp(dat->vett_clienti[dat->nome_cognomeClienti].nome, nome_cognome)    == 0 ||
              strcmp(dat->vett_clienti[dat->nome_cognomeClienti].cognome, nome_cognome) == 0)
              {
                  printf("\n cliente4.txt: Nome o cognome presente");

                  printf(" \n %s: %s\n %s: %s\n",dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].nome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].cognome);
              }
              else
                printf("\n cliente4.txt: Nome o cognome non presente");
       }

       if(file_clienti5 != NULL){
           fscanf(file_clienti5,"%s %s %s %s", dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].nome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].cognome);

           if(strcmp(dat->vett_clienti[dat->nome_cognomeClienti].nome, nome_cognome)    == 0 ||
              strcmp(dat->vett_clienti[dat->nome_cognomeClienti].cognome, nome_cognome) == 0)
              {
                  printf("\n cliente5.txt: Nome o cognome presente");

                  printf(" \n %s: %s\n %s: %s\n",dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].nome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].cognome);
              }
              else
                printf("\n cliente5.txt: Nome o cognome non presente");
       }

       if(file_clienti6 != NULL){
           fscanf(file_clienti6,"%s %s %s %s", dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].nome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].cognome);

           if(strcmp(dat->vett_clienti[dat->nome_cognomeClienti].nome, nome_cognome)    == 0 ||
              strcmp(dat->vett_clienti[dat->nome_cognomeClienti].cognome, nome_cognome) == 0)
              {
                  printf("\n cliente6.txt: Nome o cognome presente");

                  printf(" \n %s: %s\n %s: %s\n",dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].nome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].cognome);
              }
              else
                printf("\n cliente6.txt: Nome o cognome non presente");
       }

       if(file_clienti7 != NULL){
           fscanf(file_clienti7,"%s %s %s %s", dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].nome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
                                               dat->vett_clienti[dat->nome_cognomeClienti].cognome);

           if(strcmp(dat->vett_clienti[dat->nome_cognomeClienti].nome, nome_cognome)    == 0 ||
              strcmp(dat->vett_clienti[dat->nome_cognomeClienti].cognome, nome_cognome) == 0)
              {
                  printf("\n cliente7.txt: Nome o cognome presente");

                  printf(" \n %s: %s\n %s: %s\n",dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].nome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
                                                 dat->vett_clienti[dat->nome_cognomeClienti].cognome);
              }
              else
                printf("\n cliente7.txt: Nome o cognome non presente");
       }

       else if(file_clienti1  == NULL &&
               file_clienti2  == NULL &&
               file_clienti3  == NULL &&
               file_clienti4  == NULL &&
               file_clienti5  == NULL &&
               file_clienti6  == NULL &&
               file_clienti7  == NULL)
                 printf("\n Database vuoto\n");


      fclose(file_clienti1);
      fclose(file_clienti2);
      fclose(file_clienti3);
      fclose(file_clienti4);
      fclose(file_clienti5);
      fclose(file_clienti6);
      fclose(file_clienti7);

}

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 13:45
Venerdì, 20/02/2009
Perche' la scanf preleva solo la prima stringa e si ferma allo spazio.

Usa la

fgets

indicando stdin come handle.

P.S. Ma perche' tutti quei file? Addirittura uno per cliente????

PM Quote
Avatar
giocala88 (Normal User)
Expert


Messaggi: 248
Iscritto: 23/04/2008

Segnala al moderatore
Postato alle 14:40
Venerdì, 20/02/2009
cosa mi consiglieresti, scusa?..grazie

:)

PM Quote
Avatar
giocala88 (Normal User)
Expert


Messaggi: 248
Iscritto: 23/04/2008

Segnala al moderatore
Postato alle 16:02
Venerdì, 20/02/2009
Scusa ma io non ho capito la fgets...e comunque a me serve leggere da file.. 8-|

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 16:13
Venerdì, 20/02/2009
Testo quotato

Postato originariamente da giocala88:

Scusa ma io non ho capito la fgets...e comunque a me serve leggere da file.. 8-|



Non facciamo confusione ... avevi scritto

"Il programma, se selezionata la voce inserisci, chiederà di inserire nome, cognome e scheda.
Il problema è che quando inserisco dei dati nella voce scheda ..."

e quindi ti riferisci all'inserimento dati da TASTIERA.

E ti ho suggerito di usare la funzione fgets al posto della scanf. Ok?

Per il fatto dei file, non trovo utile inserire ogni record in un file diverso. Dovresti usare UN SOLO FILE in cui inserire i vari nominativi.

PM Quote
Avatar
giocala88 (Normal User)
Expert


Messaggi: 248
Iscritto: 23/04/2008

Segnala al moderatore
Postato alle 16:23
Venerdì, 20/02/2009
Intendi questo?

if(file_clienti1 == NULL)
        {
            file_clienti1 = fopen("cliente1.txt", "w");

            printf("\n NOME: ");
            scanf("%s", nome);
            printf("\n COGNOME: ");
            scanf("%s", cognome);
            printf("\n SCHEDA: \n");
            fgets(handle, 10000, file_clienti1);

            fprintf(file_clienti1, " NOME: %5s\n", nome);
            fprintf(file_clienti1, " COGNOME: %5s\n", cognome);
            fprintf(file_clienti1, " SCHEDA: %s\n", scheda);

        }

Scusa ma non riesco a capire bene..così non mi prende niente in input...:-|:-|8-|

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 17:11
Venerdì, 20/02/2009
Testo quotato

Postato originariamente da giocala88:

Intendi questo?

...

     fgets(handle, 10000, file_clienti1);



Ma no ... ti avevo scritto

"indicando stdin come handle" ...

quindi

     fgets(scheda, 10000, stdin);


Ultima modifica effettuata da theprogrammer il 20/02/2009 alle 17:12
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo