【问题标题】:I am getting this error, "error: expected expression before '{' token". I don't know why ? syntax looks fine to me我收到此错误,“错误:'{'令牌之前的预期表达式”。我不知道为什么?语法对我来说看起来不错
【发布时间】:2020-04-08 13:51:09
【问题描述】:
/*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 名学生做这件事。我想先和一个学生一起尝试。我得到的错误是:

错误:“{”标记之前的预期表达式
student.table.subject[5] = {'B', 'C', 'D', 'E', 'F'};

【问题讨论】:

  • 数组没有赋值运算符。因此,例如他的声明 student.table.subject[5] = {'B', 'C', 'D', 'E', 'F'};是不正确的。实际上,在此语句中,您正在尝试使用花括号列表初始化数组索引为 5 的不存在元素。
  • 这不是初始化,而是赋值。 5 超出范围 - 它必须是 0 ... 4 之一。而且您不能为其分配数组 - 您需要分配单个字符,例如'D'.

标签: c struct typedef


【解决方案1】:

对于这一行:

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:在大多数表达式中,数组类型的值被转换为指向数组第一个元素的指针,不再是左值。赋值运算符= 的左侧操作数必须是左值。因此,赋值运算符的左侧操作数不能是数组。

有多种方法可以解决 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 循环从另一个数组复制值:

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。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多