Gestione stringhe

di il
14 risposte

Gestione stringhe

Premetto che mi sto avvicinando da poco alla programmazione c, quindi spero nel vostro buonsenso e di non criticare se ho fatto qualche errore grossolano. Ancora non ho studiato i puntatori, quindi non so bene come funzionano e sto avendo dei problemi.
C'era un esercizio nel quale inserito un numero da 1 a 49 devo stampare a video il corrispondente valore scritto in numeri romani.
Siccome ho voluto fare un pochino più di quello che mi è stato chiesto, ho creato un algoritmo che riesce a convertire i numeri da 1 a 1000.
L'ho scritto in java e testato e funziona.
Algoritmo in java:

private static String trasforma(int n) {
        String stringa = "";
        String max = "n", min = "n", middle = "n";
        int divisore = 1;
        if (n <= 10) {
            max = "X";
            middle = "V";
            min = "I";
            divisore = 1;
        } else if (n <= 100) {
            max = "C";
            middle = "L";
            min = "X";
            divisore = 10;
        }else if (n <= 1000) {
            max = "M";
            middle = "D";
            min = "C";
            divisore = 100;
        }
        switch (n / divisore) {
            case 0:
                stringa += "";
                break;
            case 1:
                stringa += min;
                break;
            case 2:
                stringa += min + min;
                break;
            case 3:
                stringa += min + min + min;
                break;
            case 4:
                stringa += min + middle;
                break;
            case 5:
                stringa += middle;
                break;
            case 6:
                stringa += middle + min;
                break;
            case 7:
                stringa += middle + min + min;
                break;
            case 8:
                stringa += middle+min+min+min;
                break;
            case 9:
                stringa += min + max;
                break;
            case 10:
                stringa += max;
                break;
        }
        if (n <= 10) {
            return stringa;
        } else {
            stringa += trasforma(n % divisore);
        }
        return stringa;
    }
Poi ho provato a tradurlo in c:

char* trasforma(int n) {
        char* stringa;
        stringa = (char*) malloc (100*sizeof(char));
        stringa ="";
        char* max = "n", min = "n", middle = "n";
        int divisore = 1;
        if (n <= 10) {
            max = "X";
            middle = "V";
            min = "I";
            divisore = 1;
        } else if (n <= 100) {
            max = "C";
            middle = "L";
            min = "X";
            divisore = 10;
        }else if (n <= 1000) {
            max = "M";
            middle = "D";
            min = "C";
            divisore = 100;
        }
        switch (n / divisore) {
            case 0:
                stringa = strcat(stringa, "");
                break;
            case 1:
                stringa = strcat(stringa, min);
                break;
            case 2:
            stringa = strcat(stringa, strcat(min,min));
                break;
            case 3:
            stringa = strcat(stringa, strcat(min,strcat(min,min)));
                break;
            case 4:
            stringa = strcat(stringa, strcat(min,middle));
                break;
            case 5:
                stringa = strcat(stringa, middle);
                break;
            case 6:
            stringa = strcat(stringa, strcat(middle,min));
                break;
            case 7:
            stringa = strcat(stringa, strcat(middle,strcat(min,min)));
                break;
            case 8:
            stringa = strcat(stringa, strcat(middle,strcat(min,strcat(min,min))));
                break;
            case 9:
                stringa = strcat(stringa, strcat(min,max));;
                break;
            case 10:
                stringa = strcat(stringa, max);
                break;
        }
        if (n <= 10) {
            return stringa;
        } else {
        stringa = strcat(stringa, trasforma(n%divisore));
        }
        return stringa;
    }
Però non funziona. Se avete un pochino di tempo potete dare un'occhiata? Non controllate la correttezza dell'algoritmo(funziona anche se non so se è scritto bene perchè l'ho fatto da solo). Non riesco a visualizzare le stringhe e concatenarle tra loro. Compare a video l'errore segmentation fault (core dumped), ho visto ed è come se in memoria non ci fosse nulla(?)

14 Risposte

  • Re: Gestione stringhe

    Con questa riga

    char* max = "n", min = "n", middle = "n";

    cosa intendi fare?
  • Re: Gestione stringhe

    oregon ha scritto:



    char* max = "n", min = "n", middle = "n";
    Ora ho corretto e ho fatto char *max="n",*min="n",*middle="n";
    In pratica è per inizializzare le variabili. In java dovevo farlo per forza perchè mi dava errore, allora l'ho fatto anche qui.
    Anche se ora cancellando non mi dice più nulla.
  • Re: Gestione stringhe

    Quella linea non ha senso.

    Lo spazio delle stringhe in C deve essere allocato in precedenza. Se dichiari solamente un puntatore come char *min non potrai memorizzare nessuna stringa perché non punta a spazio allocato.
  • Re: Gestione stringhe

    Ok grazie. Scusa, ma i puntatori io non li ho mai usati, oggi li vedo per la prima volta e ancora sono agli inizi con il c, e comunque facendo malloc lo stesso non riesco ad andare avanti. Mi da sempre lo stesso errore.
  • Re: Gestione stringhe

    Ci credo, dato che il C non si studia e impara da un giorno all'altro, soprattutto per quello che riguarda il corretto uso dei puntatori.

    Se mostri cosa hai fatto con la malloc, si vede dove hai sbagliato.
  • Re: Gestione stringhe

    oregon ha scritto:


    Ci credo, dato che il C non si studia e impara da un giorno all'altro.
    Lo so che non imparo da un giorno all'altro, infatti ho specificato dall'inizio che ero un neofita. Ho voluto solamente provare a fare un esercizio più difficile di quello che mi hanno assegnato.
    Il mio intento era quello di fare l'algoritmo e ci sono riucito, perchè l'ho provato con java. Però volevo tradurlo in c e sono abbastanza testardo. Avevo visto che malloc si doveva fare solamente per mantenere la permanenza della stringa in memoria e poi liberarla con free.
    Quindi come posso risolvere?
  • Re: Gestione stringhe

    Con malloc ... appunto ... ma quindi hai provato del codice? Hai degli errori con la malloc?
  • Re: Gestione stringhe

    Si ce l'ho messo malloc..Secondo me(dalla mia ignoranza) da errore perché è come se facessi stringa += altra stringa.
    Quindi è come se andassi a memorizzare in una stringa di lunghezza n se stessa più un'altra stringa di lunghezza m...quindi avrei totale di lunghezza m+n e non posso memorizzarlo in una stringa di lunghezza n.
  • Re: Gestione stringhe

    La stringa su cui lavorerai è allocata correttamente con
    
            char* stringa;
            stringa = (char*) malloc (100*sizeof(char));
    
    Il fatto è che non puoi assegnare stringhe così

    max = "X";

    ma devi utilizzare la funzione strcpy in questo modo

    strcpy(max, "X");

    e se devi aggiungere, come hai fatto, utilizzi la strcat.
  • Re: Gestione stringhe

    Facendo cosi mi esce lo stack della memoria e mi dice che c'è un errore e non mi fa copiare x in max. Come facevo io riuscivo a assegnare x a max
  • Re: Gestione stringhe

    Come facevi tu copiava due puntatori, non scriveva dentro max perché max è un semplice puntatore e non corrisponde a memoria allocata. Come vedi è difficile parlare con chi non ha le basi del C, soprattutto per puntatori e allocazione della memoria.

    Se vuoi usare anche max come stringa, dovrai usare la malloc per assegnare lo spazio da puntare con max. Quindi

    max = (char *) malloc(100*sizeof(char));

    e poi

    strcpy(max, "X");

    NON è la stessa cosa di scrivere

    max = "X";
  • Re: Gestione stringhe

    Sisi ho fatto cosi anche con malloc. Solamente che mi da di nuovo errore di memoria. E lo so che non ho le basi. So anche che dovrei tornarci quando arriverò a quel punto, ma sono abbastanza testa dura
  • Re: Gestione stringhe

    Ora funziona.
    Ho fatto come hai detto tu con la strcpy e poi ho messo malloc a tutti i valori (per min max e middle ho messe 10*sizeof(char) mentre per stringa 100*sizeof(char)) Grazie dell'aiuto e della pazienza. Come posso chiudere il topic?
  • Re: Gestione stringhe

    Non si chiude ...
Devi accedere o registrarti per scrivere nel forum
14 risposte