Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [C]strdup...

  1. #1

    [C]strdup...

    Buongiorno a tutti!
    Sto studiando tutta la parte sulla memoria dinamica e c'è questo programma già svolto che non riesco a capire:
    [CODE]
    # include <stdio.h>
    # include <stdlib.h>
    # include <string.h>

    typedef struct Elem
    {
    char *info;
    struct Elem *next;
    } Elem;

    Elem * estrai(Elem **h, char *nome);
    void stampa (Elem *h);
    void *myAlloc (int dim);

    int
    main (void)
    {
    Elem *h, *a;
    char nome[20];

    h = NULL;
    printf ("Inserire un nome (EOF per finire) => ");

    while (scanf ("%s", nome) != EOF) {
    a = (Elem *) myAlloc (sizeof (Elem));
    a->info = strdup (nome);
    a->next = h;
    h = a;
    printf ("Inserire un altro nome (EOF per finire) => ");
    }

    while (1) {
    printf ("Inserire un nome: ");
    scanf ("%s", nome);
    a = estrai(&h, nome);
    if (a){
    printf ("Nome %s \n", a->info);
    free(a);
    }
    else
    printf ("Nome %s non trovato\n", nome);
    stampa(h);
    }

    system("pause");
    }

    Elem * estrai(Elem **h, char *nome){
    Elem *p, *a;

    p = NULL;
    a = *h;
    while (a && strcmp (a->info, nome)) {
    p = a;
    a = a->next;
    }
    if (a) {
    if (p)
    p->next = a->next;
    else
    *h = a->next;
    }
    return a;
    }

    void stampa (Elem *h){
    Elem *a;
    a = h;
    while (a) {
    printf ("%s ", a->info);
    a = a->next;
    }
    printf ("\n");

    }

    void *
    myAlloc (int dim) {
    void *p;

    p = malloc(dim);
    if (p == NULL) {
    fprintf (stderr, "ERRORE: memoria dinamica insufficiente.\n");
    exit (1);
    }
    return p;
    }
    [\CODE]

    Non capisco:
    - la funzione strdup cosa fa di preciso;
    - nella riga 32 cosa vuol dire while (1)
    - quando scrivo i nomi e poi metto ctrl z il programma non continua a fare più nulla

    quindi non capisco quale sia il compito di questo programma.
    Vi rigrazio per l'aiuto

  2. #2
    strdup

    while(1) serve per simulare un esecuzione all'infinito. Visto che in c un qualsiasi valore diverso da 0 indica un true, while(true) esegue il codice all'interno continuamente
    Di solito all'interno è presente qualche if che controlla qualche condizione e chiama un break; per forzare l'uscita dal ciclo

    con ctrl+z se non ricordo male sospendi il programma, è normale che non faccia più niente

    in ogni caso non farebbe null'altro che questa parte di codice:
    codice:
    while (1) {
        printf ("Inserire un nome: ");
       scanf ("%s", nome);
       a = estrai(&h, nome);
       if (a){ 
           printf ("Nome %s \n", a->info);
           free(a);
       }
       else
          printf ("Nome %s non trovato\n", nome);
          stampa(h);
    }
    visto che non è presente alcun controllo per bloccare il ciclo while

    al che mi chiedo, chi ha scritto questa roba?

  3. #3
    Grazie per la risposta! Non lo so chi ha scritto questo programma. Quindi mi riusciresti a dire cosa fa di preciso questo programma? Perchè non mi è tanto chiaro...

  4. #4
    ad occhio, guardando esclusivamente il main:

    ti fa inserire una serie di nomi in una struttura che visto l'uso di null e puntatori dovrebbe essere una lista

    se trova EOF termina l'inserimento nella lista

    quindi ti chiede di inserire altri nomi ma stavolta non per porli all'interno della lista ma per ricercarli nella stessa.

    Per dire: se all'inizio legge
    marco
    luigi
    gianni
    EOF

    subito dopo quando ti chiede i nomi da ricercare nella lista
    SE inserisci un nome già presente (ex input: luigi)
    ti stampa "Nome Luigi" e te lo cancella dalla lista (liberando anche la memoria relativa)

    SE inserisci un nome non presente (ex input: Lucia)
    ti avvisa "Nome Lucia non trovato"
    e ti stampa subito dopo tutti i nomi presenti nella lista

    il problema di chi ha scritto questo programma, se lo ha scritto così, è che quel while girerà all'infinito (cioè anche quando avrai estratto tutti i nomi e non ci potrà essere più nulla da ricercare) e questo problema è dovuto proprio al fatto che il while sia stato usato in modo sbagliato, senza condizione di terminazione.

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,333

    Moderazione

    Originariamente inviato da MrLukeKobe24
    Grazie per la risposta! Non lo so chi ha scritto questo programma. Quindi mi riusciresti a dire cosa fa di preciso questo programma? Perchè non mi è tanto chiaro...
    Il forum non è un servizio di consulenza dedicato per l'interpretazione di codice scritto da terzi: se hai un problema con un programma scritto da te, spiega qual è il problema o l'errore e ti daremo una mano a risolverlo; se hai un problema con codice scritto da altri, cerca TU di dargli un'interpretazione o di approfondire le conoscenze necessarie a farlo, spiegando in dettaglio cosa non capisci, senza postare invece tutto il codice e delegare ad altri l'onere di leggerselo tutto, capirlo per te e inviarti la soluzione bell'e pronta.

    Per queste ed altre considerazioni, ti rimando al Regolamento di quest'area del forum.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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.