C,从链表中打印多个整数

时间:2010-12-09 01:07:55

标签: c printing integer linked-list

我对C很新,所以我不能完全确定是什么问题。我无法弄清楚如何在函数中打印多个整数值。

添加功能:

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;
}

显示功能:

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;
}
}

我的程序打印出current_node-> id,好像它是current_node->副本,而current_node->副本打印出来为134516043,这显然是错误的。

我想我必须把错误传递给函数或其他东西,但我无法弄明白。有什么提示吗?

我把这个函数称为add:

add(name,id,copies);

列表如下:

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

我使用这段代码用用户输入调用该函数:

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 个答案:

答案 0 :(得分:1)

您显示的代码没问题,只要您没有将专辑名称传递给长度超过51个字符的add()。如果你这样做,你会得到非常奇怪的输出,并且可能会崩溃。

为了防范这种情况,您应该使用长度有限的副本 - 例如:

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;
    }
}

(请注意,sizeof *newAlbum稍微好于sizeof(struct list),因为前者在阅读该行时“显然是正确的” - 如果newAlbum的类型是{{1}},它仍然是正确的永远改变了。)

答案 1 :(得分:1)

我唯一看错的是你没有检查name的长度。你应该使用:

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

这样可以防止超出name缓冲区。