Return and pass structure through a function in C

Question:

Good night, I'm with a course completion assignment in which I have to register N employees, in my code I put 5 to make the tests faster.

This information would be saved in a structure and as I would use the structure more than once, both for registration and registration update, I decided to use the same code together with switch case. But then I thought, since this structure is going to be used more than once, I can create a function with it and call it when necessary, but it's not working, can anyone tell me where I'm going wrong? Here's the code:

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

struct funcionarios
{
    int cod_func;
    int cod_cargo;
    char end_func[100];
    char nome_func[100];
};
struct funcionarios x[4];


struct funcionarios cadastro1(struct funcionarios c)
{
    for(c = 0; c < 5; c++)
    {

        setbuf(stdin, NULL);
        printf("Digite o nome completo do funcionário: ");
        gets(x[c].nome_func);
        setbuf(stdin, NULL);
        printf("Digite o endereço do funcionário: ");
        gets(x[c].end_func);

        setbuf(stdin, NULL);
        printf("Digite o código do funcionário: ");
        scanf("%i", &x[c].cod_func);
        setbuf(stdin, NULL);
        printf("Digite o código do cargo: ");
        scanf("%i", &x[c].cod_cargo);
        printf("\n");
    }


    return c;

};



int main()
{
    setlocale(LC_ALL, "");

    int i, c, f, controle1, controle2, controle3, controle4, controle5;
    int menu=0, menu1=0, menu2=0, menu3=0, menu4=0, menu5=0, menu6=0;
    float cargos[5] = {2.500, 1.500, 12.000, 1.800, 950};



    do
    {
        if(menu < 0 || menu > 6)
        {
            printf("\nEntrada inválida, Selecione conforme mostrado.\n");
            printf("Opções válidas de 1 até 6 e 7 para encerrar.\n");
        }

        printf("\n\nSelecione uma opção conforme mostrado abaixo.\n\n");

        printf("1 - Cargos da Empresa.\n");
        printf("2 - Funcionários da Empresa.\n");
        printf("3 - Exibir relatório completo.\n");
        printf("4 - Exibir média salarial dos funcionários.\n");
        printf("5 - Exibir o valor pago que pertençam a determinado cargo.\n");
        printf("6 - Ordenação.\n");
        printf("7 - Sair.\n\n");

        printf("Digite a opção desejada: ");
        scanf("%i", &menu);
        controle1 = menu;
        system("cls");


    }
    while (menu < 0 || menu > 6);




    switch (controle1)
    {

    case 1:
    {
        do
        {
            system("cls");
            printf("\nSelecione uma opção.\n\n");
            printf("1 - Cadastrar Cargos: \n");
            printf("2 - Atualizar Cargos existentes: \n");

            printf("\nDigite a opção desejada: ");
            scanf("%i", &menu1);
            controle2 = menu1;

        }
        while(menu1 < 1 || menu1 > 2);

    }


    switch (controle2)
    {

    case 1:
    {
        system("cls");
        printf("CADASTRO DE CARGOS, PREENCHA FORMULÁRIO:\n\n");

        cadastro1(c); //Aqui chamo a função para preenche o formulário
        break;

    }

    case 2:
    {
        system("cls");
        printf("ALTERAR INFORMAÇÕES DE CARGOS, PREENCHA:\n\n");

        cadastro1(c); ////Aqui chamo a função para preenche o formulário
        break;

            }
        }
    }
}

I made a version of the code that works but using switch, this one at least executes… But the function would be to optimize the code.

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

struct funcionarios
{
    int cod_func;
    int cod_cargo;
    char end_func[100];
    char nome_func[100];
};

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


int main()
{
    setlocale(LC_ALL, "");

    int i, c, f, controle1, controle2, controle3, controle4, controle5;
    int menu=0, menu1=0, menu2=0, menu3=0, menu4=0, menu5=0, menu6=0;
    float cargos[5] = {2.500, 1.500, 12.000, 1.800, 950};
    struct funcionarios x[4];




/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



    do
    {
        if(menu < 0 || menu > 6)
        {
            printf("\nEntrada inválida, Selecione conforme mostrado.\n");
            printf("Opções válidas de 1 até 6 e 7 para encerrar.\n");
        }

        printf("\n\nSelecione uma opção conforme mostrado abaixo.\n\n");

        printf("1 - Cargos da Empresa.\n");
        printf("2 - Funcionários da Empresa.\n");
        printf("3 - Exibir relatório completo.\n");
        printf("4 - Exibir média salarial dos funcionários.\n");
        printf("5 - Exibir o valor pago que pertençam a determinado cargo.\n");
        printf("6 - Ordenação.\n");
        printf("7 - Sair.\n\n");

        printf("Digite a opção desejada: ");
        scanf("%i", &menu);
        controle1 = menu;
        system("cls");


    }
    while (menu < 0 || menu > 6);



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



    switch (controle1)
    {

    case 1:
    {
        do
        {
            system("cls");
            printf("\nSelecione uma opção.\n\n");
            printf("1 - Cadastrar Cargos: \n");
            printf("2 - Atualizar Cargos existentes: \n");

            printf("\nDigite a opção desejada: ");
            scanf("%i", &menu1);
            controle2 = menu1;

        }
        while(menu1 < 1 || menu1 > 2);

    }


    switch (controle2)
    {

    case 1:
    {
        do
        {
            system("cls");
            printf("CADASTRO DE CARGOS, PREENCHA FORMULÁRIO:\n\n");

            for(c = 0; c < 5; c++)
            {

                setbuf(stdin, NULL);
                printf("Digite o nome completo do funcionário: ");
                gets(x[c].nome_func);
                setbuf(stdin, NULL);
                printf("Digite o endereço do funcionário: ");
                gets(x[c].end_func);

                setbuf(stdin, NULL);
                printf("Digite o código do funcionário: ");
                scanf("%i", &x[c].cod_func);
                setbuf(stdin, NULL);
                printf("Digite o código do cargo: ");
                scanf("%i", &x[c].cod_cargo);
                printf("\n");
            }

            //printf("Retornar para tela principal? SIM - 1 / NÃO - 2:  ");
            //scanf("%i", &controle1);

        }
        while(x[i].cod_cargo < 1 || x[i].cod_cargo > 5);

    }

    case 2:
    {
        do
        {
            system("cls");
            printf("ALTERAR INFORMAÇÕES DE CARGOS, PREENCHA:\n\n");

            for(c = 0; c < 5; c++)
            {

                setbuf(stdin, NULL);
                printf("Digite o nome completo do funcionário: ");
                gets(x[c].nome_func);
                setbuf(stdin, NULL);
                printf("Digite o endereço do funcionário: ");
                gets(x[c].end_func);

                setbuf(stdin, NULL);
                printf("Digite o código do funcionário: ");
                scanf("%i", &x[c].cod_func);
                setbuf(stdin, NULL);
                printf("Digite o código do cargo: ");
                scanf("%i", &x[c].cod_cargo);
                printf("\n");
            }

            //printf("Retornar para tela principal? SIM - 1 / NÃO - 2:  ");
            //scanf("%i", &controle1);

        }
        while(x[i].cod_cargo < 1 || x[i].cod_cargo > 5);

    }
    }
    }
}

Can someone give me a light on how I can pass the structure to a function and call it whenever the user is going to use it? Whether to register or replace information…

Answer:

You can do as @JonathanBarbosa19 explained by returning the created struct. But you can also pass the reference as a parameter.

typedef struct funcionarios
{
    int cod_func;
    int cod_cargo;
    char end_func[100];
    char nome_func[100];
}Funcionarios; 
//criei um apelido para a tua struct para não colocar struct toda vez

Funcionarios x[4];//não deves usar variaveis globais. Remove isto e //declara no main 

//Não precisa retornar pois recebe o parâmetro por referência e já altera //o mesmo.
void cadastro(Funcionarios *c) {
        //quando ponteiro, acessa-se a struct com -> ao inves do . 
        setbuf(stdin, NULL);
        printf("Digite o nome completo do funcionário: ");
        gets(c->nome_func);
        setbuf(stdin, NULL);
        printf("Digite o endereço do funcionário: ");
        gets(c->end_func);
        setbuf(stdin, NULL);
        printf("Digite o código do funcionário: ");
        scanf("%i", &c->cod_func);
        setbuf(stdin, NULL);
        printf("Digite o código do cargo: ");
        scanf("%i", &c->cod_cargo);
        printf("\n");
    }
}//tinha um ; errado aqui

int main() {
   Funcionarios x[3];

   for(int i=0; i<3; i++){
      cadastro(x[i]);//como se trata de um vetor, não se coloca o &
    }
   return 0;
}
Scroll to Top