2010-12-09 59 views
1

Je suis très nouveau sur C, donc je ne suis pas tout à fait sûr de ce qui se passe. Je n'arrive pas à comprendre comment imprimer plus d'une seule valeur entière dans une fonction.C, Impression de plus d'un entier à partir d'une liste chaînée

fonction add:

void add(char *name,int id,int copies) 
{ 
/* Pointer to next item */ 
struct list *newAlbum; 

newAlbum = malloc(sizeof(struct list)); 
strcpy((*newAlbum).name, name); // Set album name 
newAlbum->id = id; 
newAlbum->copies = copies; 
newAlbum->pNext = pFirst; 
pFirst = newAlbum; 
} 

fonction show:

void show() 
{ 
system("clear"); 
struct list *current_node; 
current_node = pFirst; 
while(current_node != NULL) 
{ 
    printf("Album #%d \n",current_node->id); 
    printf("Album Name: %s \n",current_node->name); 
    printf("Album Copies:%d \n",current_node->copies); 
    printf("\n"); 
    current_node=current_node->pNext; 
} 
} 

Mes programme imprime le current_node-> id comme si elle était current_node-> exemplaires et current_node-> exemplaires est imprimé comme 134516043, ce qui est évidemment, faux.

Je pense que je dois passer quelque chose de mal à la fonction ou quelque chose, mais je ne peux pas comprendre. Des conseils?

j'appelle la fonction ajouter comme ceci:

add(name,id,copies); 

La liste est comme ceci:

/* THE LIST */ 
struct list{ 
    char name[52]; 
    int id; 
    int copies; 
    int sold; 
    struct list* pNext; 
}; 
struct list *pFirst = NULL; 

J'appelle la fonction avec l'entrée d'utilisateur avec ce morceau de code:

printf("Enter the name of the new album. \n"); 
scanf("%s",&name); 
printf("Enter the album id. \n"); 
scanf("%d",&id); 
printf("Enter number of copies. \n"); 
scanf("%d," &copies); 
// Pass data to add() 
add(name,id,copies); 
+2

Quelle est la définition de 'struct list'? (En particulier, quel est le type de 'name'?) – caf

+0

Désolé à ce sujet. Ajoutée. –

+1

Quelle est la valeur de 'copies' lors de l'appel de' add'? Avez-vous essayé avec des littéraux à la place, pour faire la vérification (au cas où la variable a la mauvaise valeur), c'est-à-dire 'add (" blah ", 3, 8);'? – lijie

Répondre

1

Votre code que vous avez montré est OK, aussi longtemps que vous ne passez pas un nom d'album à add() qui est plus long t 51 caractères. Si vous le faites, vous aurez une sortie très bizarre, et peut-être un accident.

Pour éviter cela, vous devez utiliser une copie limitée de longueur - par exemple:

void add(char *name,int id,int copies) 
{ 
    /* Pointer to next item */ 
    struct list *newAlbum; 

    newAlbum = malloc(sizeof *newAlbum); 
    if (newAlbum) { 
     snprintf(newAlbum->name, sizeof newAlbum->name, "%s", name); // Set album name 
     newAlbum->id = id; 
     newAlbum->copies = copies; 
     newAlbum->pNext = pFirst; 
     pFirst = newAlbum; 
    } 
} 

(notez que sizeof *newAlbum est un peu mieux que sizeof(struct list), puisque le premier est « manifestement correcte » lors de la lecture du line - il sera toujours correct si le type de newAlbum est modifié).

1

La seule chose que je peux voir mal ici est que vous ne vérifiez pas la longueur de name. Vous devez utiliser:

strncpy(newAlbum->name, 52, name);

Cela permettra d'éviter le tampon name dépassement.

+0

Les arguments de 'strncpy()' sont mélangés. Il devrait être 'strncpy (newAlbum-> name, name, 52);' –

+0

Il laisse aussi potentiellement 'newAlbum-> name' non terminé (dans la même situation où il y aurait déjà eu un overrun). Pas autant d'ordures que d'ordures. –