C, Печать более одного целого числа из связанного списка - PullRequest
1 голос
/ 09 декабря 2010

Я очень плохо знаком с 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-> copy, и 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 ]

1 голос
/ 09 декабря 2010

Единственное, что я могу видеть здесь неправильно, это то, что вы не проверяете длину name.Необходимо использовать:

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

Это предотвратит переполнение буфера name.

1 голос
/ 09 декабря 2010

Ваш код, который вы показали, в порядке, если вы не передаете название альбома в add() длиной более 51 символа.Если вы это сделаете, вы получите очень странный вывод и, возможно, сбой.

Чтобы защититься от этого, вы должны использовать ограниченную по длине копию - например:

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 когда-либо будет изменен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...