Auto Generating Structure Member Names in C - c

I've recently been introduced to struct and in experimenting, I encountered a problem that I can't seem to find a solution for.
I want to create a structure with several members but I want the names for each member to be automatically generated to avoid tedious process of doing this manually. So far I have my structure and a function which I want to use to create a member.
STRUCT
struct Customers
{
char name[30];
int age;
}
PROTOTYPE
void newCustomer(Customers *Customer);
FUNCTION
void newCustomer(Customers *Customer)
{
char gender;
int age;
scanf_s("%c", 1, &gender);
scanf_s("%d", &age);
Customer->gender = gender;
Customer->age = age;
}
MAIN
int main()
{
int noOfCustomers;
int i = 0;
printf("How many customers will you be entering? : ");
scanf_s("%d", &noOfCustomers);
for(i = 0; i < noOfCustomers; i++)
{
Customers i;
newCustomer(&i);
}
return 0;
}
Basically I want to do something like this... where each member is automatically represented by an ID or number. I do understand that the above example won't work because i is being declared locally within the loop as a sructure member and not an int but I want to know if there is a method of achieving this.
Thanks in advance for any help :)

You can use static integer variable, call itoa to convert it to string, and then, increment.

Related

Assigning same value to 2d struct object array

Struct student
{
char last_name[30];
char first_name[30];
};
Struct examination_seating
{
struct student** seating;
};
void student_init_default(struct student *p)
{
*p->first_name=*"###";
*p->last_name=*"###";
}
void examination_seating_init(int rowNum, int columnNum, struct examination_seating *t)
{
for (int i=0; i<rownNum; i++)
{
for(int j=0; j<columnNum; j++)
{
student_init_default(&t->seating[i][j]);
//this creates a read access violation
}
}
}
I am working on a school project and have it written but am having difficulty debugging. My TA and teacher is providing little help. I submitted parts of the code I am having issues with. I need to assign a default value from student_init_default function to the array. If I try to do it with char I get errors as well. I couldn't find any clear references online.
*p->first_name=*"###";
*p->last_name=*"###";
C strings cannot be assigned this way (this assigns only the first character). We have to use strcpy:
strcpy(p->first_name, "###");
strcpy(p-> last_name, "###");
Moreover, since student_init_default(&t->seating[i][j]) creates a read access violation, you haven't correctly initialized t or t->seating[i], so it was unwise that you only submitted parts of the code you're having issues with.

nested structs - input

i need to input name to a variable (first name*) in a struct
with a malloc
i don't understand why to program is fail to run.
im inserting the name (for example David)
and its should gets the name and put it in temp array
and then to resize the pointer first_name*
and copy the string temp to first_name*
someone can help me understand why its doesn't work?
look for the function "ReadPerson".
typedef struct{
int day, month, year;
} Date;
typedef struct{
char *first_name, *last_name;
int id;
Date birthday;
} Person;
void ReadDate(Date *a)
{
printf("insert day, month, year\n");
scanf("%d%d%d", &a->day, &a->month,&a->year);
}
void ReadPerson(Person *b)
{
char temp_first_name[21];
char temp_last_name[21];
printf("insert first name:\n");
gets(temp_first_name);
b->first_name = (char*)malloc(strlen(temp_first_name)+1);
strcpy(b->first_name,temp_first_name);
//need to check malloc (later)
printf("insert last name:\n");
gets(temp_last_name);
b->last_name = (char*)malloc(strlen(temp_last_name)+1);
strcpy(b->last_name, temp_last_name);
//need to check malloc (later)
printf("insert id\n");
scanf("%d",&b->id);
printf("insert person's birthday:\n");
ReadDate(b);
}
Thanks.
i don't understand why to program is fail to run
Well, it's because you're trying to substitute incompatible types and decent compiler should have told you about that.
Let's look at the end of function void ReadPerson(Person *b):
{
...
ReadDate(b); // error here
}
As you can see b is of type Person * and you pass it to the function void ReadDate(Date *a) which expects a Date * type.
So it is probably a simple typo, just change to this: ReadDate(&b->birthday);.

How to loop through a struct inside a struct while looping through the outer struct C Program

Hi I am trying to create a structure inside a structure, the first structure will contain details for a number of students, the second structure will contain details of a number of modules from each student. Each time asking the user to input details for each student. I was able to create an instance of student structure called data and each time loop through each instance of data and scan in information for each student once only that worked for me. I am now trying to create another inside loop that will scan in a number of different modules that will assign these to each student. I am having problems with the second loop and would appreciate some guidance.
struct module{
char moduleid[5];
int credit;
float grade;
};
//create structure student at includes a datatype
//module
struct student{
char id[10];
char fname[15];
char lname[15];
struct module results;
};
int main()
{
int i;
int j;
int numStuds;
int numMods = 10;
printf("Enter number of students\n");
scanf("%d",&numStuds);
struct student data[numStuds]; //create an instance of structure student called data
struct data.results mods[numMods];
//input data
for (i=0; i<numStuds; i++){
printf("PLEASE ENTER STUDENT DATA :\n\nID, FNAME AND LNAME\n");
scanf("%s%s%s",data[i].id,data[i].fname,data[i].lname);
for (j=0; j<numMods; j++){
printf("\nENTER MODULE DATA: \nMODULEID, CREDIT, GRADE :\n");
scanf("%s%d%f",data[i].results.mods[j].moduleid,&data[i].result.smods[j].credit,&data[i].results.mods[j].grade);
}
}
I think that your main problem is that in the way you have declared "results" inside your student struct you can only have one result for each student. Try to use an static array (if you know how many results you have) or a dynamic one if you want to declare its size during runtime.
e.g
struct student{
char id[10];
char fname[15];
char lname[15];
struct module *results; //Pointer to declare a dynamic array
};
For static declaration
struct student{
char id[10];
char fname[15];
char lname[15];
struct module results[size]; //Pointer to declare a dynamic array
};
If you use the pointer solution remember to access that attribute using "->" operator
Like acostela said, you might want a pointer to a dynamic array. However, I do not see why each student needs multiple results. So when you have the number of students entered, you would just know that each student had one module, referred to as data.result or data->result if you used malloc. If you really need dynamic arrays, I can show you some macros to do this easily.
Okay. I will just show you creation and deletion macros, you can do expansion, inserting, and deleting with realloc and memmove; it would take me too long to write them all out.
#include <stdint.h>
#define ARRAY_DECL(name, type) struct { uint32_t count; type *array } name;
#define ARRAY_DESTROY(name) free(name.array);
These macros create what is called an anonymous structure; this means that it is a one-of-a-kind struct, in this case called name. ARRAY_DESTROY then frees the array inside the struct.

How do I use a structure?

Ok firstly I'll explain my assignment. For this assignment I have to use dynamic memory allocation which I am having no problems with. What I am having a problem with is figuring out the correct way to work my assignment. For my assignment I need to create a program that prompt the user to enter how many students they have then ask for the following information; Student ID, Birthdate, and Phone number. I need to use a loop to prompt the user to enter all the students information. I need to create a loop that will scan through all the student IDs and find the oldest student using their birthdate (The loop must be able scan through more then 3 students).
Here is my code, I've gotten some suggestions and even bits of code from you guys, but after implementing them I'm even more confused on what I should do. Please take a look at it and critique me.
EDIT: I also added in on the code where I'm receiving and error
Thank you.
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int * studentData= NULL;
int * studentDataType=NULL;
int students;
int studentID;
int year;
int month;
int day;
long long phone;
printf("How many students are you entering records for:\n");
scanf("%d", &students);
studentData=(int*)malloc((sizeof(int)*students));
struct studentDataType
{
int studentID;
int year;
int month;
int day;
long long phone;
};
//invalid operands to binary * (have 'int' and 'int *')
studentDataType *studentData = (studentDataType*)malloc(numberOfStudents *sizeof(studentData));
for (int i = 0 ; i < students ; ++i)
{
printf("%d, %d, %d, %d, %d\n", studentID, year, month, day, phone);
}
}
You're redefining studentData
int * studentData= NULL;
then later
studentDataType *studentData = (studentDataType*)malloc(numberOfStudents * sizeof(studentData));
You should declare the studentDataType struct first (outside of main() ) then use it in your original declaration
To see the task it is better at least for the first time to write some block-scheme of what you have to do in a program. In your case:
Read data from user (each structure).
Increase array size, add new structure.
Loop 1-2 until input user finish adding new people (needs some condition here to finish).
Find necessary structure and print it.
So the first step is to read information from user. You can use scanf():
In the simplest way you can do that step-by-step for each field:
#include <stdio.h>
...
int value;
scanf("%d", &value);
...
In case of success this function should return number of items it reads (1 in your case).
For phone you should use scanf("%ld", &phone).
To resize array use function realloc() (#include :
realloc(&ptr_to_array, new_size);
Each elements of the array is a pointer to structure "student".
Next steps are similar.
The first problem is that you have variable names the same as the name of the type. Although you can have that in C to a certain extent, like:
typedef int x;
x foo (x x)
{
return x;
}
It might be a good idea not to do this for the readability purposes. So in your case you have:
int * studentData= NULL;
int * studentDataType= NULL;
which is a variable name, then you have:
struct studentDataType ...
which is a name of the type (should be used as struct studentDataType, not without struct as you do); finally
studentDataType *studentData = ...
is treated by the compiler as an operation on two variables, not a type declaration as you would expect. So your memory allocation needs to be:
struct studentDataType *studentData = malloc(numberOfStudents *sizeof(struct studentData));
Which brings a problem that you redefine studentData, which you declared in the beginning of the program, and "numberOfStudents" is not defined, probably you wanted to write "students" instead.
As for the reading data with scanf, see the previous comment.

Do I need to create three separate arrays for my assignment?

Ok firstly I'll explain my assignment. For this assignment I have to use dynamic memory allocation which I am having no problems with. What I am having a problem with is figuring out the correct way to work my assignment. For my assignment I need to create a program that prompt the user to enter how many students they have then ask for the following information; Student ID, Birthdate, and Phone number. I need to use a loop to prompt the user to enter all the students information. I need to create a loop that will scan through all the student IDs and find the oldest student using their birthdate (The loop must be able scan through more then 3 students).
Here is my code, I havent done much in it yet because I'm not sure really where to start. I've already setup the dynamic memory allocation, but I don't know how to work the rest of this. Please help me.
Thank you.
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int * studentData= NULL;
int students;
printf("How many students are you entering records for:\n");
scanf("%d", &students);
studentData=(int*)malloc((sizeof(int)*students));
}
You could define a structure:
//Define a type, such as int, char, double...
typedef struct studentDataType {
int ID;
int birthDateDay;
int birthDateMonth;
int birthDateYear;
int phoneNumber;
};
Then create an array, where each of those elements is of type studentData:
//Create an array, where each element is of type studentData
studentDataType *studentData = (studentDataType *)malloc(numberOfStudents * sizeof(studentData));
Then loop through them with:
for (int i = 0 ; i < numberOfStudents ; ++i) {
printf("%i %i %i\n", studentData[i].ID, studentData[i].phoneNumber);
}
Use the following struct. You can make year, month and day as separate fields. It will be simpler for a quick start:
struct Student
{
int studentID;
int year;
int month;
int day;
long long phone; // phone is too large for 32 int
};

Resources