Неправильное назначение в строковой переменной структуры в C - PullRequest
2 голосов
/ 22 января 2020

Пожалуйста, помогите мне с этим кодом. Почему одно и то же имя присваивается всем различным структурам? Я нуб к указателям и массивам в C.

struct student
{
    char *name;
    int reg_no;
};
typedef struct student student;

int main()
{
    char choice = 'y';
    char name[30];
    int rg;
    student students[5];
    int n = 0;
    while(choice != 'n')
    {
        printf("enter student's name\n>>");
        gets(name);
        printf("enter student's reg_no\n>>");
        scanf("%d",&rg);
        getchar();
        students[n].name = name;
        students[n].reg_no = rg;
        printf("enter details of more students (y/n)\n>>");
        scanf("%c",&choice);
        getchar();
        n++;
    }
    for(int i=0;i<n;i++)
    {
        printf("Details of student%d :\n",(i+1));
        printf("Name : %s\n",students[i].name );
        printf("Reg no. : %d\n\n",students[i].reg_no );
    }
    return 0;
}

Работает в консоли:

enter image description here

Редактировать: Добавлена ​​структура студента

1 Ответ

7 голосов
/ 22 января 2020

В этом выражении

students[n].name = name;

элемент данных name всех элементов массива студентов получает один и тот же адрес локальной переменной name.

Вам необходимо объявить член данных name структуры как массив символов и использовать либо стандартную функцию C strcpy, либо strncpy, чтобы скопировать содержимое локальной переменной name в элемент данных name.

Например,

#define N 30

struct student
{
    char name[N];
    int reg_no;
};

typedef struct student student;

int main( void )
{
    char choice = 'y';
    char name[N];
    //…

Обратите внимание, что функция gets является небезопасной функцией и не поддерживается стандартом C. Вместо этого используйте стандартную C функцию fgets.

Например

#include <string.h>

//…

fgets( name, sizeof( name ), stdin );
name[strcspn( name, "\n" )] = '\0';

//…
strcpy( students[n].name, name );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...