Я получаю эту ошибку "ошибка: ожидаемое выражение перед '{' токеном" ». Я не знаю почему? синтаксис выглядит хорошо для меня - PullRequest
1 голос
/ 08 апреля 2020
/*Using structures, write an interactive C program to 
generate Grade Card for BCA first semester courses for
20 students of your study centre.*/

#include<stdio.h>

struct Marks
{
    char subject[5];
    float subject_marks[5];
};

struct GradeCard
{
    char name[30];
    int roll_num;
    struct Marks table;

}; 
int main()
{
struct GradeCard student;
int i;

//name of student
printf("Enter the name of student: \t");
scanf("%s", &student.name);

//roll number of student
printf("Enter the roll number of student: \t");
scanf("%d", &student.roll_num);

//name of courses
printf("Enter the subjects: \t");
student.table.subject[5] = {'B', 'C', 'D', 'E', 'F'};

//marks in respective courses
for (i = 0; i < 5; i++)
{
    scanf("%f", &student.table.subject_marks[i]);
}

//printing all the details
printf("%s\n", student.name);
printf("%d\n", student.roll_num);
for(i = 0; i < 5; i++)
{
    printf("%s : %f\n",student.table.subject[i], student.table.subject_marks[i]);
}

}

Я должен сделать это для 20 студентов. Я хочу попробовать это с одним студентом сначала. Я получаю следующую ошибку:

ошибка: ожидаемое выражение перед '{' token
student.table.subject [5] = {'B', 'C', ' D ',' E ',' F '};

1 Ответ

2 голосов
/ 08 апреля 2020

Для этой строки:

student.table.subject[5] = {'B', 'C', 'D', 'E', 'F'};

Я полагаю, что OP считает, что строка присваивает значения всем элементам массива student.table.subject[5] так же, как char subject[5] = {'B', 'C', 'D', 'E', 'F'}; инициализирует все элементы массива subject[5]. Они могут выглядеть аналогично, но назначение не совпадает с инициализацией.

Есть некоторые проблемы с назначением, предпринятым выше. : -

Задача 1: {'B', 'C', 'D', 'E', 'F'} в правой части выражения присваивания не является значением любого типа. Его можно превратить в значение типа char [5], изменив его на составной литерал . (char [5]){'B', 'C', 'D', 'E', 'F'} является составным литералом типа char [5]; он также может быть записан как (char []){'B', 'C', 'D', 'E', 'F'}, где количество элементов определяется числом инициализаторов между фигурными скобками. Это безымянный объект массива.

Проблема 2. В большинстве выражений значение типа массива преобразуется в указатель на первый элемент массива и больше не является lvalue, Левый операнд оператора присваивания = должен быть lvalue. Следовательно, левый операнд оператора присваивания не может быть массивом.

Существуют различные способы решения проблемы OP. : -

Решение 1. Используйте memcpy для копирования значений из другого массива:

static const char subjects[5] = {'B', 'C', 'D', 'E', 'F'};
memcpy(student.table.subject, subjects, 5);

или:

memcpy(student.table.subject, (char [5]){'B', 'C', 'D', 'E', 'F'}, 5);

(Примечание. Используется составной литерал , содержащий содержимое исходного массива для копирования в место назначения.)

или:

memcpy(student.table.subject, "BCDEF", 5);

(Примечание: "BCDEF" используется только для удобство там. Он имеет тип char [6], включая нулевой терминатор, но копируются только первые 5 элементов.)

Решение 2. Используйте for l oop, чтобы скопировать значения из другого массива. :

static const char subjects[5] = {'B', 'C', 'D', 'E', 'F'};

for (i = 0; i < 5; i++)
{
    student.table.subject[i] = subjects[i];
}

или:

for (i = 0; i < 5; i++)
{
    student.table.subject[i] = ((char []){''B', 'C', 'D', 'E', 'F'})[i];
}

или:

for (i = 0; i < 5; i++)
{
    student.table.subject[i] = "BCDEF"[i];
}

Решение 3. Присвойте каждому элементу массива линейную последовательность операторов:

student.table.subject[0] = 'B';
student.table.subject[1] = 'C';
student.table.subject[2] = 'D';
student.table.subject[3] = 'E';
student.table.subject[4] = 'F';

(Примечание: для большого количества элементов это будет утомительно и будет неэффективно использовать исполняемую память, если компилятор не сможет оптимизировать ее до эквивалента memcpy.)

...