How do I pass a vector of struct per reference parameter?

1

(1) In the check_read function it is not printing the correct values I'm reading in the read_dates function, it's printing a bunch of random numbers and symbols. (2) If I solve the problem, how can I print all the surveys I've done?

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
typedef struct
{
char nome[10],sexo[10],estado_civil[12],grau[12],canal[10];
int idade,horario;
} ENQUETE;
int main()
{
setlocale(LC_ALL,"portuguese");
ENQUETE ler[10];
int i=0,opcao;
printf("\n-------------------- ENQUETE IBOPE --------------------\n");
while(1)
{
    menu();
    printf("\n Opção: ");
    scanf("%d",&opcao);
    if (opcao == 3) break;
    switch(opcao)
    {
    case 1:
        ler_dados(&ler[i]);
        break;
    case 2:
        checar_enquete(ler[i]);
        break;
    case 3:
        return 0;
        break;
    }
  i=i+1;
}
}
void menu()
{
printf("\n----------------------- MENU --------------------------\n");
printf("\n Digite 1 para realizar uma nova enquete\n");
printf("\n Digite 2 para Checar as enquetes\n");
printf("\n Digite 3 para SAIR\n");
}
void ler_dados(ENQUETE *read)
{
fflush(stdin);
printf("\n Digite o Nome: ");
gets(read->nome);
printf("\n Digite a idade: ");
scanf("%d",&read->idade);
fflush(stdin);
printf("\n Digite o sexo(Masculino,Feminino ou Outro): ");
gets(read->sexo);
printf("\n Digite o Estado Civil(Solteiro,Casado,Viúvo ou Divorciado): ");
gets(read->estado_civil);
printf("\n Digite o Grau de Instrução(Fundamental,Médio,Superior,\n Mestrado 
ou Doutorado): ");
gets(read->grau);
printf("\n Digite o Horário da entrevista: ");
scanf("%d",&read->horario);
fflush(stdin);
printf("\n Digite o Canal(Globo,Band ou SBT): ");
gets(read->canal);
}

void checar_enquete(ENQUETE read)
{
int j=1,i=0;
printf("\n-------------------- ENQUETES %d --------------------------\n",j);
printf("\n Nome: %s",read.nome);
printf("\n Idade: %d",read.idade);
printf("\n Sexo: %s",read.sexo);
printf("\n Estado Civil: %s",read.estado_civil);
printf("\n Grau de Instrução: %s",read.grau);
printf("\n Horário da Entrevista: %d",read.horario);
printf("\n Canal: %s",read.canal);
printf("\n------------------------------------------------------------------
-\n");
}
    
asked by anonymous 25.11.2017 / 18:12

1 answer

0
int main()
{
setlocale(LC_ALL,"portuguese");
ENQUETE ler[10];
int i=0,opcao;
printf("\n-------------------- ENQUETE IBOPE --------------------\n");
do {
    menu();
    printf("\n Opção: ");
    scanf("%d",&opcao);
    if (opcao == 3) break;
    switch(opcao)
    {
    case 1:
        ler_dados(&ler[i]);
        i=i+1;
        break;
    case 2:
        checar_enquete(ler, i);
        break;
    case 3:
        return 0;
        break;
    }
} while (opcao != 3);
}


void ler_dados(ENQUETE *read)
{
printf("\n Digite o Nome: ");
scanf("%s", read->nome);fflush(stdin);
printf("\n Digite a idade: ");
scanf("%d", &read->idade);fflush(stdin);
printf("\n Digite o sexo(Masculino,Feminino ou Outro): ");
scanf("%s", read->sexo);fflush(stdin);
printf("\n Digite o Estado Civil(Solteiro,Casado,Viúvo ou Divorciado): ");
scanf("%s", read->estado_civil);fflush(stdin);
printf("\n Digite o Grau de Instrução(Fundamental,Médio,Superior,\n Mestrado ou Doutorado): ");
scanf("%s", read->grau);fflush(stdin);
printf("\n Digite o Horário da entrevista: ");
scanf("%d",&read->horario);fflush(stdin);
printf("\n Digite o Canal(Globo,Band ou SBT): ");
scanf("%s", read->canal);fflush(stdin);
}

void checar_enquete(ENQUETE read[10], int j)
{
    int i = 0;

    while (i < j) {
printf("\n-------------------- ENQUETES %d --------------------------\n",i);
printf("\n Nome: %s",read[i].nome);
printf("\n Idade: %d",read[i].idade);
printf("\n Sexo: %s",read[i].sexo);
printf("\n Estado Civil: %s",read[i].estado_civil);
printf("\n Grau de Instrução: %s",read[i].grau);
printf("\n Horário da Entrevista: %d",read[i].horario);
printf("\n Canal: %s",read[i].canal);
printf("\n-------------------------------------------------------------------\n");
i++;
}
}

Some considerations and a possible solution to your problem:

  • It is not good practice to use fgets because it brings security issues by not limiting the size of the data entry;

  • Your read method was correct with & amp ;;

  • I have modified your method to check to go through the vector and show all registered.

25.11.2017 / 18:44