0

次の問題があります。宿題では、5 人の生徒のレコード「student」のヒープ配列を作成し、いくつかの値 (名前など) を割り当てることになっています。以前に行った方法でレコードに値を割り当てようとすると、「 { の前に式が必要です」というエラーが表示されます。

Edit:

typedef struct student_t {
char hauptfach[128];
char name[64];
int matnr;
} student;

/Edit

student *students;
students = malloc(5*sizeof(student));


students[0] = {"Info", "Max Becker", 2781356};
students[1] = {"Soziologie", "Peter Hartz", 6666666};
students[2] = {"Hurensohnologie", "Huss Hodn", 0221567};
students[3] = {"Info", "Tomasz Kowalski", 73612723};
students[4] = {"Info", "Kevin Mueller", 712768329};

しかし、たとえば単一の値を割り当てようとすると

students[0].hauptfach = "Informatik";

プログラムがコンパイルされます。

私は何を間違っていますか?

前もって感謝します、

D.

4

2 に答える 2

2

構造定義を示していませんが、文字列はchar最大サイズの配列であると予想されます。

文字列を割り当てるには、 を使用する必要がありますstrncpy。その機能を見てください。

hauptfach基本的に、メンバーのMAX_LEN+1長さが文字であると仮定します。

strncpy( students[0].hauptfach, "Informatik", MAX_LEN+1 );
students[0].hauptfach[MAX_LEN] = 0;  // Force termination if string truncated.

おっと、申し訳ありませんが、あなたの質問を読み違えました。上記はまだ当てはまるかもしれません。

そのような構造体をコピーすることはできません。配列定義で初期化する必要があります。

struct mystruct students[5]  = {
  {"Info", "Max Becker", 2781356},
  {"Soziologie", "Peter Hartz", 6666666},
  {"Hurensohnologie", "Huss Hodn", 0221567},
  {"Info", "Tomasz Kowalski", 73612723},
  {"Info", "Kevin Mueller", 712768329}
};

または、示したようにフィールドを個別に割り当てることもできます。別のオプションは、単一のインスタンスを初期化してから次のようにコピーすることで、1 つの配列要素全体を置き換えることができます。

struct mystruct temp = {"Soziologie", "Peter Hartz", 6666666};
students[0] = temp;
于 2013-01-29T22:58:43.487 に答える
1

これらの 2 つのステートメントは、実際には組み合わせることはできません。

1 students = malloc(5*sizeof(student));
2 students[0] = {"Info", "Max Becker", 2781356};

(1) は、実行時にメモリを動的に割り当てたいと言っています。

(2) は、リストした値をコンパイル時に固定アドレスに割り当てたいと言っています。残念ながら、コンパイラは のアドレスが何であるかstudents[0]を事前に知ることができないため、希望することを行うことができません。

ヘルパー関数を作成することをお勧めします:

void initstudent(student *s, const char hf[], const char name[], int matnr){
  strncpy(s->hauptfach, hf, MAXLEN);
  strncpy(s->name, name, MAXLEN);
  s->matnr=matnr;
}

そして、これを各生徒に適用します。

于 2013-01-29T23:12:21.460 に答える