Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [C] problema con stringhe

    Allora il codice serve per creare un albero binario, è già testato e funziona. Il problema da come ho capito con il debug è la stringa nome. Succede qualcosa di imprevisto quando la passo dal main alla funzione infatti crasha a puts. Aiutino? Non so che fare, mi sfugge qualcosa.
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    struct Infof
    {
        char *nome;
        char telefono[10];
    };
    struct albero
    {
        struct Infof info;
        struct albero *left;
        struct albero *right;
    };
    typedef struct albero bst;
    bst *crea_nodo(char *name)
    {
        bst *nuovo = (bst *)malloc(sizeof(bst));
        puts(name);
        strcpy(nuovo->info.nome, &name);
        printf("Inserisci numero di telefono: ");
        scanf("%s",nuovo->info.telefono);
        nuovo->left  = NULL;
        nuovo->right = NULL;
        return nuovo;
    }
    bst *insert(bst *padre, char nom)
    {
        if(padre == NULL)
        {
            return crea_nodo(nom);
        }
        if(strcmp(padre->info.nome, &nom) < 0)
        {
            return insert(padre->left, nom);
        }
        else if (strcmp(padre->info.nome, &nom) > 0)
        {
            return insert(padre->right, nom);
        }
        return padre;
    }
    void preorder(bst *nodo)
    {
        if(nodo != NULL)
            {
                printf("Nome: %s\n", nodo->info.nome);
                printf("Numero di telefono: ");
                printf("%s",nodo->info.telefono);
                puts("");
                preorder(nodo->left);
                preorder(nodo->right);
            }
    }
    int main()
    {
        bst *head = NULL;
        char nome[12];
        printf("Inserisci nome: ");
        gets(nome);
        head = insert(head, &nome);
        short int grado;
        printf("Inserisci il grado della radice: ");
        scanf("%hi", &grado);
        grado = pow(2,grado)-2;
        short int i;
        for(i = 0; i < grado; i++)
        {
            printf("Inserisci nome: ");
            scanf("%s", &nome);
            insert(head, *nome);
        }
        preorder(head);
        return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Utilizzi il puntatore nome senza allocare prima dinamicamente la memoria necessaria.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Utilizzi il puntatore nome senza allocare prima dinamicamente la memoria necessaria.
    quale? Intendi quello nella struct? Anche se lo cambio in nome[12]
    non cambia nulla

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Intendo quello della struttura.

    Quello che hai cambiato e come � adesso il codice lo devi mostrare, altrimenti non serve dire che non cambia nulla.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Chiami crea_modo con un carattere, non con un puntatore a caratteri. Inoltre chiami insert che prende un carattere con un puntatore a un puntatore a carattere.
    Leggi i warning che ottieni come prima cosa.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Chiami crea_modo con un carattere, non con un puntatore a caratteri. Inoltre chiami insert che prende un carattere con un puntatore a un puntatore a carattere.
    Leggi i warning che ottieni come prima cosa.
    codice:
    struct Infof
    {
        char nome[12];
        char telefono[10];
    };
    struct albero
    {
        struct Infof info;
        struct albero *left;
        struct albero *right;
    };
    typedef struct albero bst;
    bst *crea_nodo(char name)
    {
        bst *nuovo = (bst *)malloc(sizeof(bst));
        puts(&name);
        strcpy(nuovo->info.nome, &name);
        printf("Inserisci numero di telefono: ");
        scanf("%s",nuovo->info.telefono);
        nuovo->left  = NULL;
        nuovo->right = NULL;
        return nuovo;
    }
    bst *insert(bst *padre, char *nom)
    {
        if(padre == NULL)
        {
            return crea_nodo(nom);
        }
        if(strcmp(padre->info.nome, &nom) < 0)
        {
            return insert(padre->left, nom);
        }
        else if (strcmp(padre->info.nome, &nom) > 0)
        {
            return insert(padre->right, nom);
        }
        return padre;
    }
    void preorder(bst *nodo)
    {
        if(nodo != NULL)
            {
                printf("Nome: %s\n", nodo->info.nome);
                printf("Numero di telefono: ");
                printf("%s",nodo->info.telefono);
                puts("");
                preorder(nodo->left);
                preorder(nodo->right);
            }
    }
    int main()
    {
        bst *head = NULL;
        char nome[12];
        printf("Inserisci nome: ");
        gets(nome);
        head = insert(head, nome);
        short int grado;
        printf("Inserisci il grado della radice: ");
        scanf("%hi", &grado);
        grado = pow(2,grado)-2;
        short int i;
        for(i = 0; i < grado; i++)
        {
            printf("Inserisci nome: ");
            scanf("%s", &nome);
            insert(head, *nome);
        }
        preorder(head);
        return 0;
    }
    ci sono 3 warning ma quello interessante è :warning: passing argument 1 of 'crea_nodo' makes integer from pointer without a cast

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    In insert passi a strcmp un char ** ma si aspetta un char * e passi a crea_nodo un char ma si aspetta un char *.
    Inoltre se hai un variabile char c, &c non è equivalente a una stringa, una stringa è terminata da '\0'.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  8. #8
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    In insert passi a strcmp un char ** ma si aspetta un char * e passi a crea_nodo un char ma si aspetta un char *.
    Inoltre se hai un variabile char c, &c non è equivalente a una stringa, una stringa è terminata da '\0'.
    il problema per adesso non è lo strcmp perché già solo se inserisco la radice e pongo il grado uguale ad 1 non mi stampa correttamente il nome della radice. Comunque ho cambiato la insert mettendo char * (stessa cosa anche a crea_nodo). Per quanto riguarda e stringhe io ho usato la gets. Se uso la scanf e guardo cosa contiene la memoria la variabile è memorizzata correttamente.

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Il problema è che non hai capito come lavorano i puntatori e come è rappresentata una stringa. I tipi sono messi a caso e i problemi nel codice sono ovvi se comprendi i due aspetti di cui sopra. I punti in cui ci sono errori li ho già esposti, sono quelli e quelli rimangono, tuttavia se non capisci perché stai sbagliando è meglio se ristudi tali parti da un manuale.

    Inoltre non dovresti mai sottovalutate un warning, l'unico warning accettabile è quello che ti aspetti prima di compilare la prima volta.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  10. #10
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Il problema è che non hai capito come lavorano i puntatori e come è rappresentata una stringa. I tipi sono messi a caso e i problemi nel codice sono ovvi se comprendi i due aspetti di cui sopra. I punti in cui ci sono errori li ho già esposti, sono quelli e quelli rimangono, tuttavia se non capisci perché stai sbagliando è meglio se ristudi tali parti da un manuale.

    Inoltre non dovresti mai sottovalutate un warning, l'unico warning accettabile è quello che ti aspetti prima di compilare la prima volta.
    non sottovaluto i warning è solo che i due successivi fanno parte di una porzione di codice non interessante. Per quanto riguarda i puntatori so come funzionano ma sto avendo problemi con le stringhe. Ho cambiato come dici tu ma non va.

    codice:
    struct Infof
    {
        char nome[12];
        char telefono[10];
    };
    struct albero
    {
        struct Infof info;
        struct albero *left;
        struct albero *right;
    };
    typedef struct albero bst;
    bst *crea_nodo(char *name)
    {
        bst *nuovo = (bst *)malloc(sizeof(bst));
        puts(&name);
        strcpy(nuovo->info.nome, &name);
        printf("Inserisci numero di telefono: ");
        scanf("%s",nuovo->info.telefono);
        nuovo->left  = NULL;
        nuovo->right = NULL;
        return nuovo;
    }
    bst *insert(bst *padre, char *nom)
    {
        if(padre == NULL)
        {
            return crea_nodo(nom);
        }
        if(strcmp(padre->info.nome, &nom) < 0)
        {
            return insert(padre->left, nom);
        }
        else if (strcmp(padre->info.nome, &nom) > 0)
        {
            return insert(padre->right, nom);
        }
        return padre;
    }
    void preorder(bst *nodo)
    {
        if(nodo != NULL)
            {
                printf("Nome: %s\n", nodo->info.nome);
                printf("Numero di telefono: ");
                printf("%s",nodo->info.telefono);
                puts("");
                preorder(nodo->left);
                preorder(nodo->right);
            }
    }
    int main()
    {
        bst *head = NULL;
        char nome[12];
        printf("Inserisci nome: ");
        gets(nome);
        head = insert(head, &nome);
        short int grado;
        printf("Inserisci il grado della radice: ");
        scanf("%hi", &grado);
        grado = pow(2,grado)-2;
        short int i;
        for(i = 0; i < grado; i++)
        {
            printf("Inserisci nome: ");
            scanf("%s", &nome);
            insert(head, *nome);
        }
        preorder(head);
        return 0;
    }

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.