[Solved] Printing structures using loop


I think you need 2 structs. An astronaut and a mission aren’t the same thing. As it is now, you have several unused fields depending on whether you’re entering data for an astronaut or a mission. You could do something like this:

#include <stdio.h>

#define maxName 50
#define maxNation 50
#define maxAge 100

struct astronaut
{
    char firstName[maxName];
    char lastName[maxName];
    char nation[maxNation];
    int age;
};

struct mission
{
    char missionName[maxAge];
    int missionYear;  // why do you have an array of 50 ints for the missionYear?
};

void enter_candidate_data(struct candidate* cand)
{
    // not famliar with gets_s .. I would use fgets here, you can read the manpage on that if you desire
    printf("Please enter the first name of the candidate: ");
    gets_s(cand->firstName);
    printf("Please enter the last name of the candidate: ");
    gets_s(cand->lastName);
    printf("Please enter the nationality of the candidate: ");
    gets_s(cand->nation);
    printf("Please enter the age of the candidate: ");
    scanf("%d", &(cand->age));
}

void enter_mission_data(struct mission* mis)
{
    printf("Enter a Mission Name: ");
    gets_s(mis->missionName);
    printf("Enter the year the mission was conducted: ");
    scanf("%d", &(mis->missionYear));
}

int main()
{
    int i;
    struct astronaut candidates[3];
    struct mission missions[3];

    for (i=0; i<3; i++)
    {
        enter_candidate_data(&(candidates[i]));
        // you can put this in a separate loop if you want to enter all
        // candidate data first
        enter_mission_data(&(missions[i]));
    }

    // you could also write functions to print the data instead, depends on
    // how you want it all presented

    for (int i=0; i<3; i++)
    {
        printf("Name: %s %s \t Age: %d \t Nationality: %s\n",
            candidates[i].firstName, candidates[i].lastName, candidates[i].nation);
        printf("Mission Name: %s, year %d\n", missions[i].missionName,
            missions[i].missionYear);
    }

    return 0;
}

You may want a number of missions (or even just one) associated with a particular astronaut. If so, I would define the data structures like this

#define MAX_ASTRONAUT_MISSIONS 20

struct mission
{
    char missionName[maxAge];
    int missionYear;
};

struct astronaut
{
    char firstName[maxName];
    char lastName[maxName];
    char nation[maxNation];
    int age;
    struct mission missions[MAX_ASTRONAUT_MISSIONS];
};

This will allow you to associate MAX_ASTRONAUT_MISSION missions with each astronaut. Or, more realistically, a single mission could be associated with several astronauts. In that case, you may want data structures more like this

struct mission
{
    char missionName[maxAge];
    int missionYear;
};

struct astronaut
{
    char firstName[maxName];
    char lastName[maxName];
    char nation[maxNation];
    int age;
    // using a pointer to missions will allow you to create one mission, and
    // all the astronauts on that mission could get a pointer to it,
    // designating they were all on that singular mission.
    struct mission* missions[MAX_ASTRONAUT_MISSIONS];
};

solved Printing structures using loop