My background is in c# and i'm trying to learn C now.
For this purpose, I am working on this sample program.
What I want to do is read user inputs for each property of the Member and also assign Policies to each member in a loop. I managed to get this far but while im trying to read the Policy_Type I run into a Segmentation Fault error. I am struggling to understand why.
#include<stdio.h>
#include<string.h>
enum PolicyType
{
Car = 1,
Health = 2,
Travel = 3,
Pet = 4
};
// Member structure
struct Member
{
int Member_ID;
char Name[20];
int Policy_Count;
// Policy structure
struct Policy
{
char Policy_ID[20];
int Member_ID;
char Policy_Type[20];
int Premium;
} policies[]; // each member could maintain 0 or many policies - nested structure
};
void mainMenu(){
printf("1. Add new member\n");
printf("2. Display all members\n");
printf("3. Search member by name\n");
printf("4. Calculate total premium\n");
printf("5. Exit\n");
printf("Enter your choice--- ");
};
struct Member collectNewMemberDetails(){
struct Member member;
printf("a. Enter the member details:\n");
printf("b. Member Name:\n");
scanf("%s", member.Name); // saves the member name in structure
printf("c. Member ID:\n");
scanf("%d", &member.Member_ID);
printf("d. How many policies for the member:\n");
scanf("%d", &member.Policy_Count);
for (int i = 0; i < member.Policy_Count; i++)
{
char policyId[20];
char policyType[20];
int policyPremium;
printf("a. Enter Policy ID: \n");
scanf("%s", policyId);
printf("b. Enter Policy Type: \n");
scanf("%s", policyType);
printf("c. Enter Policy Premium: \n");
scanf("%d", &policyPremium);
strcpy(member.policies[i].Policy_ID, policyId );
strcpy(member.policies[i].Policy_Type, policyType );
member.policies[i].Premium = policyPremium;
member.policies[i].Member_ID = member.Member_ID;
}
return member;
}
int main(int argc, char const *argv[])
{
mainMenu();
int choice;
scanf("%d", &choice);
struct Member newMember;
switch (choice)
{
case 1:
newMember = collectNewMemberDetails();
break;
default:
break;
}
printf("Member name: %s\n", newMember.Name);
printf("Member Policy Type: %s\n", newMember.policies[0].Policy_Type);
return 0;
}
during a debug session with dbg, right after I enter the premium, I receive this error:
-- omitted for brevity
c. Enter Policy Premium:
22
Thread 1 received signal SIGSEGV, Segmentation fault.
0x0000002b in ?? ()
I am going crazy to figure out why. Could you please point me in the right direction?
Thanks a lot in advance.
newMember.policiesis uninitialized.scanf("%s", ...)andstrcpy()are unsafe; prefer variants that won't overrun the end of the buffer?