2015-12-03 1 views
0
extern int ID; // student ID number 
    struct personalDetails det; // pD 
    struct classRecords rec; // cR 
    struct student st1; // student 1 
    struct student st2; // student 2 
    struct student st3; // student 3 
    struct student st4; // student 4 
    struct student st5; // student 5 

    char pD[30]; // for storing values that will be assigned to personalDetails 
    double cR; // for storing values that will be assigned to classRecords 

    struct student studentID(int id) { // identifies student by ID 
    if (id == 1) { 
      struct student x = st1; 
      return x; 
    } 
    else if (id == 2) { 
      struct student x = st2; 
      return x; 
    } 
    else if (id == 3) { 
      struct student x = st3; 
      return x; 
    } 
    else if (id == 4) { 
      struct student x = st4; 
      return x; 
    } 
    else if (id == 5) { 
      struct student x = st5; 
      return x; 
    } 
    } 

Мне нужна функция updateName(), чтобы присвоить значение «имя», которое является значением внутри другой struct personalDetails.Как присвоить значение структуре, которая возвращается через функцию в C

void updateName() { 
    printf("Enter student's name\n"); 
    scanf("%s", pD); 

    studentID(ID).det.name = pD; 

В настоящее время я получаю эту ошибку:

operations.c: In function ‘updateName’: 
    operations.c:55:24: error: lvalue required as left operand of assignment 
    studentID(ID).det.name = pD; 

Скажите, пожалуйста, как я могу это исправить, заранее спасибо!

EDIT 1: Вот структура defs для заинтересованных.

struct personalDetails { 
     char *name; 
     char *phoneNum; 
     char *address; 
}; 

struct classRecords { 
     double assignment; 
     double midterm; 
     double finalMark; 
     double total; 
}; 

struct student{ 
     struct personalDetails det; 
     struct classRecords rec; 
}; 

Спасибо за ответы, зЬгсру избавились от ошибки компиляции, но теперь, когда я ввести значение «имя» я получаю 'ошибку сегментации. Кто-нибудь знает, почему?

+0

'typedef' является вашим другом;) –

ответ

0

C не позволяет вам напрямую назначать строки с использованием равного оператора. Вы можете использовать strncpy (include string.h). Прочитайте о функции, набрав «man strncpy» в терминале или перейдя по ссылке.

+0

Даже после прочтения руководства для' strncpy', OP не должен его использовать, он слишком подвержен ошибкам. – chqrlie

0

Вы не указали свою декларацию struct student; но выглядит как name - массив символов. Затем

scanf("%s", &pD); неверен, должен быть scanf("%s", pD); как pD уже является адресом символа строки.

Кроме того, studentID(ID).det.name = pD; неверен, вы не можете использовать прямое назначение для строковой переменной, вместо этого используйте strcpy.

+0

Строго говоря, 'pD' не является указателем, а массивом. Он будет преобразован в указатель для использования в качестве аргумента функции.(В общем случае для операндов операторов, отличных от 'sizeof' и' & 'для получения адреса) – MikeCAT

+0

strcpy избавляется от ошибки при компиляции, но теперь, когда я запускаю свою программу, я получаю« ошибку сегментации »при вводе значения для 'имя'. Вы знаете, почему это так? – rsorce

+0

SIGSEGV обычно означает, что вы не ссылаетесь на неинициализированный указатель или вы получаете доступ к массиву вне пределов. Пожалуйста, проверьте член данных 'name' в структуре' student'. – artm

1

studentID(ID) возвращает копию той структуры, в которой хранятся данные, которые необходимо хранить в другой структуре. Вы, вероятно, хотите, чтобы вернуть указатель на него и использовать этот синтаксис:

strcpy(studentID(ID)->det.name, pD); 

Но вы должны также обратить внимание на потенциальные переполнения буфера: например, scanf с форматом %s не знает размер массива указывает на по pD. Вы должны написать вместо этого:

scanf("%29s", pD); 

Но говорить scanf о размерах буфера очень громоздко, как информация о размере должна быть жестко закодирована в строке формата и может выйти из синхронизации, если впоследствии изменить фактический размер массива pD. scanf очень сложно использовать правильно.

+0

, так что ничего страшного в его 'scanf'? – artm

+0

@artm: 'scanf' почти всегда ошибается ;-) Я обновил свой ответ, чтобы отразить это. – chqrlie

0

Я думаю, вы хотите что-то вроде этого. Используйте указатели.

extern int ID; // student ID number 
struct personalDetails det; // pD 
struct classRecords rec; // cR 
struct student st1; // student 1 
struct student st2; // student 2 
struct student st3; // student 3 
struct student st4; // student 4 
struct student st5; // student 5 

    char pD[30]; // for storing values that will be assigned to personalDetails 
    double cR; // for storing values that will be assigned to classRecords 

struct student *studentID(int id) { // identifies student by ID 
    if (id == 1) { 
      return &st1; 
    } 
    else if (id == 2) { 
      return &st2; 
    } 
    else if (id == 3) { 
      return &st3; 
    } 
    else if (id == 4) { 
      return &st4; 
    } 
    else if (id == 5) { 
      return &st5; 
    } 
} 

void updateName() { 
    struce student *s; 
    printf("Enter student's name\n"); 
    scanf("%29s", pD); 

    s = studentID(ID); 
    s->det.name = malloc(strlen(pD) + 1); 
    strcpy(s->det.name, pD); 
} 

Я не уверен, если это правильно, потому что я не знаю, определение struct student, но, пожалуйста, не делайте такую ​​глупость, как и присвоение (указатель на первый элемент массива) фиксированного для нескольких структур.

+0

Мои извинения, я только недавно начал использовать C. Но всякий раз, когда я использую ->, я получаю другую ошибку Ошибка: неверный аргумент типа '->' (есть 'struct student') strcpy (studentID (ID) -> det .name, pD); – rsorce

+0

@rsorce Добавьте '*' в конец возвращаемого типа 'studentID()' и сделайте его указателем, как я. – MikeCAT

+0

Я обновил свой код. Вам нужно будет выделить некоторый буфер перед копированием строк. – MikeCAT

Смежные вопросы