我对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);
答案 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
缓冲区。