Problema vettore di stringhe

di il
3 risposte

Problema vettore di stringhe

Salve, il mio problema riguarda un vettore di stringa.
Devo scrivere un programma che prenda in input un file contenente stringhe e una stringa.
Il programma deve stampare tutte le stringhe contenute nel vettore di stringhe(dictionary) maggiori dell'altra stringa(str) rispetto all'ordine lessicografico.
Il mio programma però confronta solo la stringa di prova con la prima stringa del vettore dictionary, stampando di conseguenza o tutta la lista o niente.
Dove ho sbagliato?
#include <stdio.h>
#define MAX 100
int lex_less(char x[],char y[][MAX],int c);

int main()
{
 char dictionary [MAX][MAX]; 
 char str[MAX];
 int dim=0,i; 

 FILE *fp;
 fp=fopen("Stringhe.txt","r");
 while(!feof(fp))
 {
  fscanf(fp,"%s",dictionary[dim]);
  dim++;
 }
   
 printf("Inserisci stringa str:\n");
 scanf("%s",str);
 
 for(i=0;i<dim;i++)
 {
  if(lex_less(str,dictionary,dim)==1)
  {
   printf("%s\n",dictionary[i]);
  }
 }
}

int lex_less(char x[],char y[][MAX],int c)
{
 int i,j;
 for(i=0;i<c;i++)
 {
  for(j=0;j<MAX;j++)
  {
    if(x[j]<y[i][j])
   {
    return 1;
    break;
   }
   else if(x[j]>y[i][j])
   {
    return 0;
    break;  
   }
  }
 }
}

3 Risposte

  • Re: Problema vettore di stringhe

    Di pasticci ce ne sono un bel po'.

    primo) in C quale e' il valore di una variabile quando viene dichiarata? e di un vettore?

    secondo) la viariabile 'dictionary' e' un vettore o una matrice?

    terzo) un vettore quante dimensioni ha, ed una matrice?

    quarto) come si cerca una parola in un dizionario?

    quinto) serve per forza confrontare MAX caratteri?
  • Re: Problema vettore di stringhe

    Allora ieri sono riuscito a risolvere il problema.
    Innanzitutto rispondo alle tue domande, quando una variabile viene dichiarata senza assegnamento, C da un valore a caso, salvo sovrascriverlo in caso di successivo uso della stessa.
    La variabile dictionary è un vettore di stringhe, o una matrice di char che dir si voglia, quindi ha due dimensioni (righe e colonne). Non è necessario confrontare MAX, piuttosto il ciclo for della funzione si puo scrivere come
    for(j=0;y[h][j]!='\0';j++)
    Ho risolto mettendo come la variabile h come globale, aggiornandola nel main dopo ogni chiamata di lex_less!
  • Re: Problema vettore di stringhe

    C'è un pò di confusione,sopratutto in lex_less,che nel tuo caso specifico e nel rispetto del codice scritto nel main dovrebbe avere la forma simile alla funzione strcmp().
    
    int lex_less(char* a,char *b)
    {
        for (; *a != '\0' && *b != '\0' ; a++,b++)
        {
            if ( *a > *b)
                return 1;
            else if ( *a < *b)
                return -1;
        }
        if (*a != '\0') return 1;
        if (*b != '\0') return -1;
        return 0;
    }
    
    quindi il main:
    
    ...
    for(i=0;i<dim;i++)
    {
        if(lex_less(dictionary[i],str)==1)
        {
             printf("%s\n",dictionary[i]);
        }
    }
    
    Invece fai una doppia ricerca nel dizionario che non ha alcun senso.
    Potresti anche ottimizzare tutto con le librerie standard del c e dopo aver caricato il dizionario e immesso la parola di ricerca incaricare la funzione lex_less di visualizzare i dati, e quindi la funzione prenderebbe una forma tipo questa:
    
    void lex_less(char* f,char dict[][MAX_DICTIONARY] ,int countword)
    {
        //wordscan
        int ws;
        for (ws = 0; ws < countword ;ws++)
        {
            if (strcmp(dict[ws],f) == 1)
                printf("%s\n",dict[ws]);
        }
    }
    
Devi accedere o registrarti per scrivere nel forum
3 risposte