C错误:预期表达式

时间:2015-08-14 20:26:45

标签: c arrays struct

首先发布在这里。所以我正在构建一个程序,它在结构中保存学生的记录。我想使用一个数组有六个元素,然后将每个元素作为结构....我有

typedef struct {
    char* name;
    char* surname;
    char* UUN;
    char* department;
    char gender;
    int age;
} student;

...

int main(void) {

int i;

student studentarr[5];

... 因此,任务是定义前三个元素,并让用户输入后三个元素。我尝试过定义;

studentarr[0] = { "John", "Bishop", "s1234", "Inf", 'm', 18 };
studentarr[1] = { "Lady", "Cook", "s345", "Eng", 'f', 21 };
studentarr[2] = { "James", "Jackson", "s3456", "Eng", 'm', 17 };

但是编译器给了我错误

studentDB2.c:27:18: error: expected expression
    studentarr[0] = { "John", "Bishop", "s1234", "Inf", 'm', 18 };
                    ^

studentDB2.c:28:18: error: expected expression
    studentarr[1] = { "Lady", "Cook", "s345", "Eng", 'f', 21 };
                    ^

studentDB2.c:29:18: error: expected expression
    studentarr[2] = { "James", "Jackson", "s3456", "Eng", 'm', 17 };
                    ^

如何解决此问题?

另一个问题是宣言 学生studentarr [5] 实际上创建了六个结构,如;

studentarr[0]
studentarr[1]
studentarr[2]
studentarr[3]
studentarr[4]
studentarr[5]

我非常清楚这看起来很基本,但我必须参加这种问题的考试。感谢所有帮助!

编辑:

所以我有一个功能

void printStudent(student s) {
    printf("Name: %s %s\n", s.name, s.surname);
    printf("UUN: %s\n", s.UUN);
    printf("Department: %s\n", s.department);
    printf("Gender: %c\n", s.gender);
    printf("Age: %d\n", s.age);
}

编译器要求用户在学生结构中输入信息(在帖子开头),但现在当printStudent函数运行时,它会显示输入的信息,如

Student 5
Name: Nina Storrie
UUN: S3736PSYf
Department: PSYf
Gender: f
Age: 19

为什么UUN和部门会这样打印?

2 个答案:

答案 0 :(得分:2)

如果你想拥有一个数组来存储6名学生的信息,那么你必须声明它像

student studentarr[6];
                  ^^^

您可以在声明

时对其进行初始化
student studentarr[6] =
{
    { "John", "Bishop", "s1234", "Inf", 'm', 18 },
    { "Lady", "Cook", "s345", "Eng", 'f', 21 },
    { "James", "Jackson", "s3456", "Eng", 'm', 17 }
};

在这种情况下,只显式初始化了数组的三个元素。所有其他元素由零隐式初始化。

如果要为数组的元素赋值,可以使用复合文字来完成。

例如

student studentarr[6];
studentarr[0] = ( student ) { "John", "Bishop", "s1234", "Inf", 'm', 18 };

否则,您必须分别为数组的元素分配每个数据成员。

例如

studentarr[0].name = "John";
studentarr[0].surname = "Bishop";

等等

编辑:更新代码后,此初始化数据成员部门声明为

char department[3];

如果要存储字符串,则字符串文字“Inf”无效。字符串文字有4个字符,包括终止零。因此,如果您希望数据成员部门也包含此类字符串,则必须将其声明为

char department[4];
                ^^

答案 1 :(得分:1)

您不能使用这样的语法来设置结构的值:

studentarr[0] = { "John", "Bishop", "s1234", "Inf", 'm', 18 };

此语法仅在定义变量时有效:

student studentarr[5] = { 
    { "John", "Bishop", "s1234", "Inf", 'm', 18 }, 
    { "Lady", "Cook", "s345", "Eng", 'f', 21 }, 
    { "James", "Jackson", "s3456", "Eng", 'm', 17 },
    ... 
};

此外,像studentarr[5]这样的定义会创建一个包含五个索引为0到4的元素的数组。

你的结构的另一个问题。因为您将要用作字符串的字段定义为char *,所以在初始化时为它们提供的值是只读的。您应该将这些字段定义为字符数组。

例如:

typedef struct {
    char name[50];
    char surname[50];
    char UUN[20];
    char department[10];
    char gender;
    int age;
} student;

编辑:

C字符串包含NUL终止符,因此请确保为该字符留出足够的空间。另外,在scanf中使用长度说明符,以确保用户不会为该字段输入太多字符。