2

これを行うには少し問題があります。構造体を使用してID番号ごとに個人情報を保存するプログラムを作成しています。次に、配列に格納してから、for ループで検索する必要があります (簡単です)。コンパイルしようとすると、構造体や共用体ではないメンバー「何とか」を要求するというエラーが表示されます。

最後の printf ステートメントでこのエラーが発生します。

    #include <stdio.h>
#include <stdlib.h>

struct infoStruct  
{
  int studentID;
  int year;
  int month;
  int day;
  int phone;
  int end;
};

int main (void)
{
  int students = 0;

struct infoStruct *info = NULL;

  while (info.end != -1) {
    students = students + 1;
    printf("Enter student information (ID, day, month, year, phone)\n");
    printf("Enter -1 following the phone number to end the process to continue enter 0\n");
    info = malloc(sizeof(struct infoStruct) * students);
    scanf("%d %d %d %d %d %d", &info.studentID, &info.day, &info.month, &info.year, &info.phone, &info.end);
  }

  printf("You entered %d student(s)\n", students);

  printf("Enter Student ID\n"); 
  scanf("%d", info.studentID); 

}
4

5 に答える 5

2

まず、配列は type である必要がありますinfoStruct。の値を知っておく必要がありますstudents。次に、次のようなことができます。

for (int i=0;i<students;++i)
{
  scanf(%d %d"[...],&infoArray[i].studentID, &infoArray[i].year[...]);
}
于 2013-11-08T15:44:47.970 に答える
1

「info」はポインタです。したがって、その値にアクセスするには、参照を解除する必要があります。構造体の配列を使用しているため、次の方法で実行できます。

scanf("%d %d %d %d %d %d", &info[some_counter].studentID, &info[some_counter].day, &info[some_counter].month, &info[some_counter].year, &info[come_counter].phone, &info[come_counter].end);

また、realloc() 呼び出しを使用して構造体の配列のサイズを変更し、何らかの方法でループの終了条件を修正することをお勧めします。info が NULL であり、開始直前にこの NULL ポインターを逆参照しようとしているため、クラッシュします。
realloc() を使用したループは、次のコードのようになります。

  while (true) {
    printf("Enter student information (ID, day, month, year, phone)\n");
    printf("To finish enter word \"end\"\n");

    struct infoStruct *new_info = realloc(info, (students+1)*sizeof(struct infoStruct));
    if (new_info == NULL) {
      printf("Out of memory! errno = %s\n", strerror(errno));
      break;
    } else {
      info = new_info;
    }
    result = scanf("%d %d %d %d %d %d", 
        &info[students].studentID,
        &info[students].day, 
        &info[students].month, 
        &info[students].year, 
        &info[students].phone, 
        &info[students].end
                  );

    if (result != 6) {
      students--;
      info = realloc(info, sizeof(struct infoStruct) * students);
      break;
    }

    students++;
  }
于 2013-11-08T16:37:22.680 に答える
1

infoArrayと宣言されていintます。のような構造要素は提供しません infoArray.studentID。これにより、コンパイラーは不平を言います...構造体でも共用体でもない何か。

infoArray [students];withint students = 0;も疑問です。

あなたは得るでしょう(必要に応じて書き直されました。ただし、いくつかの未解決の質問があります):

#include <stdio.h>
#include <stdlib.h>

#define MAX_STUDENTS 200

typedef struct {
  int studentID;
  int year;
  int month;
  int day;
  int phone;
  int end;
} info_TYPE;

int main (void)
{
  info_TYPE infoArray [MAX_STUDENTS];
  int students = 0;

  while (infoArray[students].end != -1) {
    printf("Enter student information (ID, day, month, year, phone)\n");
    printf("Enter -1 following the phone number to end the process to continue enter 0\n");
    scanf("%d %d %d %d %d %d", &infoArray[students].studentID, &infoArray[students].day, &infoArray[students].month, &infoArray[students].year, &infoArray[students].phone, &infoArray[students].end);
    students = students + 1;
    if (students >= MAX_STUDENTS) break;
  }
  if (infoArray[students - 1].end = -1) printf("You entered %d student(s)\n", students);

  printf("Enter Student ID", infoArray[students - 1].studentID); 
  // no idea what this line was for, presumably another previous attempt.
  scanf("%d", infoArray[students - 1].studentID); 
  // getting tired to follow the speed at which the question is modified, presumably last edit here!
}
于 2013-11-08T15:50:28.417 に答える
0

コンパイラは不平を言っています。

printf("学生IDを入力してください", infoArray.studentID);

infoArray.studentID を構造体のメンバーとして扱いますが、そうではありません。

于 2013-11-08T15:46:31.050 に答える