miiworld2
miiworld2

Reputation: 306

I'm trying to create a program with a loop that prompts the user to enter data in the array elements

I'm trying to create a program with a loop that prompts the user to enter data in the array elements. And when the user no longer can enter data, print to screen the data entered in a last in, first out order.

And this is my attempt...

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

struct Name_Age
{
    char Name[10];
    int Age;
};

void printMe(struct Name_Age info)
{
    printf("Name: %s\n", info.Name);
    printf("Age:  %d\n", info.Age);
}

int main()
{
    int size = 0, i = 0, j = 0;
    struct Name_Age * array_ptr = (struct Name_Age*)malloc((size + 1)* sizeof(struct Name_Age));
    struct Name_Age myInfo = *array_ptr;

    printf("Enter size of array: ");
    scanf("%d\n", size);

    for (i = 0; i < size; ++i)
    {
        printf("Enter Name: \n");
        scanf("%s\n", myInfo.Name);
        printf("Enter Age: \n");
        scanf("%d\n", myInfo.Age);
    }

    printMe(myInfo);

    return 0;

};

Upvotes: 0

Views: 107

Answers (4)

elricfeng
elricfeng

Reputation: 394

First, scanf("%d", &size) replace scanf("%d\n", size), put &size instead of size as argument(You need an address), and put the malloc things after this line of code, because you need an exact size value before malloc. Same thing with all the scanf stuffs.

As you want to print out all your input names and ages in order, I changed your code like this:

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

struct Name_Age
{
    char Name[10];
    int Age;
};

void printMe(struct Name_Age *infoList, int size)
{
    int i;
    for (i = size-1; i >= 0; --i)
    {
        printf("Name: %s\n", infoList[i].Name);
        printf("Age:  %d\n", infoList[i].Age);
        printf("\n");
    }
}

int main()
{
    int size, i;

    printf("Enter size of array: ");
    scanf("%d", &size);

    struct Name_Age * array_ptr = (struct Name_Age*)malloc(size* sizeof(struct Name_Age));

    for (i = 0; i < size; ++i)
    {
        printf("Enter Name: \n");
        scanf("%s", array_ptr[i].Name);
        printf("Enter Age: \n");
        scanf("%d", &array_ptr[i].Age);
    }

    printMe(array_ptr, size);

    return 0;
}

Try to test and compare with your code, questions are welcome.

Upvotes: 1

BLUEPIXY
BLUEPIXY

Reputation: 40145

example of fix

//struct Name_Age myInfo = *array_ptr;//Not necessary

printf("Enter size of array: ");
scanf("%d", &size);//remove `\n`, add `&`

//To ensure after the size has been determined
struct Name_Age * array_ptr = (struct Name_Age*)malloc(size * sizeof(struct Name_Age));//Cast is not necessary in C

for (i = 0; i < size; ++i)
{
    printf("Enter Name: \n");
    scanf("%s", array_ptr[i].Name);//remove `\n`
    printf("Enter Age: \n");
    scanf("%d", &array_ptr[i].Age);//need `&`
}

for (i = 0; i < size; ++i)
    printMe(array_ptr[i]);

Upvotes: 1

RastaJedi
RastaJedi

Reputation: 663

Obviously using fgets() is a much better approach, but making the fewest amount of changes as possible to your code and still achieving your result is the following:

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

struct Name_Age
{
    char Name[10];
    int Age;
};

void printMe(struct Name_Age *info);

int main(void)
{
    int size, i;
    struct Name_Age *array_ptr;

    printf("Enter size of array: ");
    scanf("%d", &size);

    array_ptr = malloc(size * sizeof *array_ptr);

    for (i = 0; i < size; ++i)
    {
            printf("Enter Name: ");
            scanf(" %s", array_ptr[i].Name);
            printf("Enter Age: ");
            scanf("%d", &array_ptr[i].Age);
            printf("\n");
    }

    for (i = 0; i < size; ++i)
            printMe(&array_ptr[i]);

    return 0;
}

void printMe(struct Name_Age *info)
{
    printf("Name: %s\n", info->Name);
    printf("Age:  %d\n", info->Age);
}

Note that passing the struct by pointer to the function should be faster, note that you don't need the myInfo struct; you can just directly modify the elements of the array. Note the space before %s in the scanf() line, this is to discard any whitespace (including \n), this is done automatically for %d so it is only necessary for your strings (technically not the first iteration of the loop, but it doesn't fail if no whitespace is found). If you have any questions about why I made the changes I did, please feel free to comment on this answer!

Upvotes: 1

Niklas Rosencrantz
Niklas Rosencrantz

Reputation: 26647

You can use fgets to read strings and cast the string to digits with atoi. The storage is not complete, but with my changes you can read to structs and specify the size of the loop (TODO: Save a list of structs so that you actually can print a list of structs that you have specified.)

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

struct Name_Age {
    char Name[10];
    int Age;
};

void printMe(struct Name_Age info) {
    printf("Name: %s\n", info.Name);
    printf("Age:  %d\n", info.Age);
}

int main() {
    int size = 0, i = 0, j = 0;
    struct Name_Age *array_ptr = malloc((size + 1) * sizeof(struct Name_Age));
    struct Name_Age myInfo = *array_ptr;

    printf("Enter size of array: ");
    char tmp[10];
    fgets(tmp, 10,stdin);
    size = atoi(tmp);
    for (i = 0; i < size; ++i) {
        printf("Enter Name: ");
        fgets(myInfo.Name, 10,stdin);
        printf("Enter Age: ");
        fgets(tmp, 10,stdin);
        myInfo.Age = atoi(tmp);
    }

    printMe(myInfo);
    return 0;

};

Test

$ ./a.out 
Enter size of array: 2
Enter Name: Superman
Enter Age: 25
Enter Name: Batman
Enter Age: 27
Name: Batman

Age:  27

See also this question about fgets fgets how to read int

Upvotes: 1

Related Questions