Problema con doppio puntatore a char

di il
2 risposte

Problema con doppio puntatore a char

Ciao, 

un grazie in anticipo a chi mi vorrà dare una mano…sto svolgendo il seguente esercizio:

Scrivete una funzione con prototipo 
void smallest_largest (char *s[], int n, char **smallest, char **largest)
che, dato un array di stringhe s lungo n, trovi gli elementi minimo e massimo 
nell’array (secondo l’ordine alfabetico).

Il mio codice è questo:

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

void smallest_largest (char *s[], int n, char **smallest, char **largest);

int main()
{
    char *small = NULL;
    char *large = NULL;
    char *parole[] = {"val di fassa", "val gardena", "sole", "marte", "mercurio"};
    
    smallest_largest (parole, 5, &small, &large);
    printf ("Parola più lunga: %s\n", large);
    printf ("Parola più corta: %s\n", small);
    
    return 0;
}

void smallest_largest (char *s[], int n, char **smallest, char **largest) {
    int i;
    int lungSmall = strlen (s[0]);
    int lungLarge = strlen (s[0]);
    
    smallest = largest = s;

    for (i = 1; i < n; i++) {
        if (strlen (s[i]) > lungLarge) {
            lungLarge = strlen (s[i]);
            largest = &s[i];
        }
        else if (strlen (s[i]) < lungSmall) {
            lungSmall = strlen (s[i]);
            smallest = &s[i];
        }
    }
    printf ("%s %d\n%s %d\n", *smallest, lungSmall, *largest, lungLarge);   /* debug */
}

La funzione “smallest_largest” è corretta, quello che non va è la stampa delle due stringhe nel main e non riesco a capire il motivo…

2 Risposte

  • Re: Problema con doppio puntatore a char

    Hai fatto l'esercizio in base alla lunghezza della stringa (strlen) e non in base all'ordine alfabetico come chiesto, comunque

    #include <stdio.h>
    #include <string.h>
    
    void smallest_largest (char *s[], int n, char **smallest, char **largest);
    
    int main(){
        char *small, *large;  
        char *parole[] = {"val di fassa", "val gardena", "sole", "marte", "mercurio"}; 
        
        smallest_largest (parole, sizeof(parole)/sizeof(parole[0]), &small, &large);
        printf ("Parola più lunga: %s\n", large);
        printf ("Parola più corta: %s\n", small);
        
        return 0;
    }
    
    void smallest_largest (char *s[], int n, char **smallest, char **largest){
        int i, j, sma = 0, lar = 0;
        int lungSmall = strlen (s[0]), lungLarge = lungSmall;
    
        for (i = 1; i < n; i++) {
            j = strlen (s[i]);
            if (j > lungLarge) {
                lungLarge = j;
                lar = i;
            }
            else if (j < lungSmall) {
                lungSmall = j;
                sma = i;
            }
        }
        *smallest = s[sma];
        *largest = s[lar];
        printf ("%s %d\n%s %d\n", *smallest, lungSmall, *largest, lungLarge); /* debug */
    }
  • Re: Problema con doppio puntatore a char

    O anche (sempre in termini di lunghezza della stringa e non in ordine lessicografico):

    #include <stdio.h>
    #include <string.h>
    
    void smallest_largest(char *s[], int n, char **smallest, char **largest)
    {
        for(unsigned int curr, min, max = min = strlen(*smallest = *largest = s[0]), i = 1; i < n; ++i)
        {
            if((curr = strlen (s[i])) < min)
            {
                min = curr;
                *smallest = s[i];
            }
            else if(curr > max)
            {
                max = curr;
                *largest = s[i];
            }
        }
    }
    
    int main()
    {
        char *smallest = NULL;
        char *largest = NULL;
        char *parole[] = {"val di fassa", "val gardena", "sole", "marte", "mercurio"};
    
        smallest_largest(parole, 5, &smallest, &largest);
        printf ("Parola piu' corta: %s\n", smallest);
        printf ("Parola piu' lunga: %s\n", largest);
    
        return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
2 risposte