PDA

View Full Version : [C] problema stringhe in liste


Gr1ph00n
12-06-2009, 19:14
Salve a tutti, posto in questa sezionepoichè stò avendo alcuni problemi con un'implementazione, stavo cercando di capire come utilizzare le liste collegate e mi era parso ideale implementare una rubrica. Non ci ho messo molto a realizzarne una semplice, fatto stà che ho un problema con la visualizzazione dei vari campi. Mi spiego meglio, andando a stampare i valori memorizzati con la printf, oltre ai valori che io ho messo, me ne escono anche altri che sono percorsi di file e cartelle, variabili di windows....

Eccovi il mio codice:




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

#define MAX_CHAR 30

typedef int BOOL;

#define FALSE 0
#define TRUE !FALSE



typedef struct _rubrica
{
int id;
char cognome[MAX_CHAR];
char nome[MAX_CHAR];
char numero[MAX_CHAR];
struct _rubrica *prev;
struct _rubrica *next;
} rubrica;

typedef struct _lista
{
rubrica *primo;
rubrica *ultimo;
} lista;

int menu();
void aggiungi();
void rimuovi();
void visualizza();
void aggiungi_dopo(rubrica *r1, rubrica *r2);
void raccogli_dati(rubrica *r);
rubrica *ottieni_ultimo();
void trim(char *s1);
void aggiungi_inizio(rubrica *r);
void aggiungi_prima(rubrica *r1, rubrica *r2);
void stampa_nodo(rubrica *r);
rubrica *cerca(const int id);
void rimuovi_nodo(rubrica *r);

int rubriche_totali;

lista *list = NULL;

int main (void)
{

void (*f[2])(void);
int scelta;
list = malloc(sizeof(lista));
if (list != NULL)
{
list->primo = NULL;
list->ultimo = NULL;
}

f[0] = aggiungi;
f[1] = rimuovi;
f[2] = visualizza;

printf("RUBRICA 0.1\n");
scelta = menu();
while (scelta)
{
if (scelta > 3)
{
scelta = menu();
continue;
}
f[scelta - 1]();
scelta = menu();
}
system("PAUSE");
return 0;
}

int menu ()
{
int ret;
printf("SELEZIONARE OPZIONE:\n1. Aggiungi\n2. Cancella\n3. Visualizza tutto\n0.Esci\n=> ");
scanf("%d", &ret);
printf("\n");
return ret;
}

rubrica *ottieni_ultimo()
{
return list->ultimo;
}

void trim(char *s1)
{
while (TRUE)
{
if (*s1 == '\n')
{
*s1 = '\0';
break;
}
s1++;
}
}

void raccogli_dati(rubrica *r)
{
char cognome[MAX_CHAR];
char nome[MAX_CHAR];
char numero[MAX_CHAR];
printf("inserire cognome:\n");
fflush(stdin);
fgets(cognome, sizeof(cognome), stdin);
trim(cognome);
printf("inserire nome:\n");
fflush(stdin);
fgets(nome, sizeof(nome), stdin);
trim(nome);
printf("inserire numero:\n");
fflush(stdin);
fgets(numero, sizeof(numero), stdin);
trim(numero);
r->id = rubriche_totali;
strncpy(r->cognome, cognome, strlen(cognome));
strncpy(r->nome, nome, strlen(nome));
strncpy(r->numero, numero, strlen(numero));
r->prev = NULL;
r->next = NULL;
rubriche_totali++;
}




void aggiungi()
{
rubrica *curr;
rubrica *r1;
r1 = malloc(sizeof(rubrica));
if (r1 != NULL)
{
raccogli_dati(r1);
curr = ottieni_ultimo();
if (curr)
{
aggiungi_dopo(curr, r1);
}
else
{
aggiungi_inizio(r1);
}
}
printf("aggiunto con id %d\n", rubriche_totali - 1);
}

void aggiungi_inizio(rubrica *r)
{
if (list->primo)
{
aggiungi_prima(list->primo, r);
}
else
{
list->primo = r;
list->ultimo = r;
r->prev = NULL;
r->next = NULL;
}
}

void aggiungi_prima(rubrica *r1, rubrica *r2)
{
r2->prev = r1->prev;
r2->next = r1;
if (r1->prev)
{
r2->prev->next = r2;
}
else
{
list->primo = r2;
}
}

void aggiungi_dopo(rubrica *r1, rubrica *r2)
{
r2->next = r1->next;
r1->next = r2;
r2->prev = r1;
if (r2->next)
{
r2->next->prev = r2;
}
else
{
list->ultimo = r2;
}
}

rubrica *cerca(const int id)
{
rubrica *r1;
r1 = ottieni_ultimo();
int index;
for (index = 0; index < rubriche_totali; index++)
{
if (r1->id == id)
{
return r1;
}
else
{
r1 = r1->prev;
}
}
return NULL;
}

void rimuovi()
{
int id;
rubrica *r1;
printf("Inserisci l'id della rubrica da rimuovere: ");
fflush(stdin);
scanf("%d", &id);
r1 = cerca(id);
if (r1 != NULL)
{
rimuovi_nodo(r1);
}
else
{
printf("valore inesistente\n");
}
}

void rimuovi_nodo(rubrica *r)
{
if (r->prev)
{
r->prev->next = r->next;
}
else
{
list->primo = r->next;
}

if (r->next)
{
r->next->id -= 1;
r->next->prev = r->prev;
}
else
{
list->ultimo = r->prev;
}
free(r);
}



void visualizza()
{
int id;
rubrica *r1;
printf("Inserisci l'id della rubrica da visualizzare: ");
fflush(stdin);
scanf("%d", &id);
r1 = cerca(id);
if (r1 != NULL)
{
stampa_nodo(r1);
}
else
{
printf("valore inesistente\n");
}
}

void stampa_nodo(rubrica *r)
{
printf("cognome=%s\nnome=%s\nnumero=%s\n", r->cognome, r->nome, r->numero);
}



Potreste aiutarmi per favore a capire dove stà l'errore ? Grazie in anticipo ;)

BrutPitt
12-06-2009, 21:58
Ho dato una scorsa veloce... ma permettimi una domanda: perche' usi "strncpy" con la lunghezza della stringa sorgente?

strncpy(r->cognome, cognome, strlen(cognome));
strncpy(r->nome, nome, strlen(nome));
strncpy(r->numero, numero, strlen(numero));


Basterebbe una semplice "strcpy".

Con "strncpy" se vuoi copiare anche il carattere nullo devi aggiungere un +1 alla lunghezza... dato che non e' aggiunto implicitamente.

Come hai fatto tu non "termini" la stringa... ed e' forse questo il motivo dei caratteri non desiderati.

Gr1ph00n
12-06-2009, 22:14
Si, hai ragione, era quello l'errore, o meglio dovevo usare la sizeof al posto della strlen per non avere problemi, comunque ora ho risolto. Grazie per la risposta :)