簡體   English   中英

C錯誤:期望的表達式

[英]C error: Expected expression

首先發布在這里。 因此,我正在構建一個程序,該程序在結構中保存有關學生的記錄。 我想使用一個具有六個元素的數組,然后將每個元素作為一個結構...。

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 };
                    ^

我該如何解決?

另一個問題是,聲明studentarrar [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和Department會這樣打印?

如果您想要一個數組來存儲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];
                ^^

您不能使用這樣的語法來設置結構的值:

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]這樣的定義studentarr[5]創建一個包含五個索引為0到4的元素的數組。

您的結構的另一個問題。 因為您將要用作字符串的字段定義為char * ,所以在初始化時為它們提供的值是只讀的。 您應該將這些字段定義為字符數組。

例如:

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

編輯:

AC字符串包含NUL終止符,因此請確保為該字符留出足夠的空間。 另外,在scanf使用長度說明符,以確保用戶在該字段中輸入的字符不會太多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM