Using Struct in C language exercise

2

/ * Write an algorithm that reads data from "N" people (name, sex, age and health) and whether or not you are fit to perform compulsory military service. Enter the totals. * /

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

struct Pessoa
{
    char nome[30];
    char sexo[1]; // M = Masculino e F = Feminino
    int idade;
    char saude[5];
};

main()
{

    int quant; // Quantidade de pessoas

    printf("Digite a quantidade de pessoas: ");
    scanf("%d", &quant);

    struct Pessoa candidato[quant];

    int i;

    for(i = 0; i < quant; i++)
    {
        printf("\nNome: ");
        fgets(candidato[i].nome,30,stdin);

        printf("\nSexo: ");
        fgets(candidato[i].sexo,1,stdin);

        printf("\nIdade: ");
        scanf(" %d", &candidato[i].idade);

        printf("\nSaude: ");
        fgets(candidato[i].saude,5,stdin);

        if(candidato[i].idade >= 18 && candidato[i].saude == "boa")
        {
            printf("O %s, sexo %s com idade %d e com saude %s esta apto ao servico militar. \n\n",
                   candidato[i].nome, candidato[i].sexo, candidato[i].idade, candidato[i].saude);
        }
        printf("\n\n");

    } // fim do for

} // fim função main()

But when I use fflush it shows "Name: Sex" (on the same line) how do I solve this?

    
asked by anonymous 15.03.2014 / 15:07

3 answers

4
  • The struct definition gets better out of the function.

  • char sexo[0] has space for zero letters. To keep "M" (or "F") and terminator accurate for at least 2 characters

  • for(i = 0; i <= quant; i++) will run the loop one more than necessary

  • After fetching the age with scanf() , an ENTER is "hung" in the input stream. The next read takes this ENTER and returns an empty string

  • Where is the rest of the program? ???

  • The gets() function should not be used. Because it was so badly thought this function was not part of C Standard in the last version (few compilers use the latest version of Standard)

  • Good luck and have fun !

  • 15.03.2014 / 15:13
    0

    Try (note the dynamic memory allocation):

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    struct Pessoa {
        char nome[31];
        char sexo; // M = Masculino e F = Feminino
        int idade;
        char saude[6];
    };
    
    main() {
        struct Pessoa *candidato;
        int quant; // Quantidade de pessoas
        int i;
        printf("Digite a quantidade de pessoas: ");
        scanf("%d", &quant);
        candidato = (struct Pessoa *) malloc(quant*sizeof(Pessoa));
        for(i=0; i<quant; i++)  {
            printf("\nNome: ");
            fgets(candidato[i].nome,30,stdin);
            printf("\nSexo: ");
            scanf("%c",&candidato[i].sexo);
            printf("\nIdade: ");
            scanf(" %d", &candidato[i].idade);
            printf("\nSaude: ");
            fgets(candidato[i].saude,5,stdin);
            if(candidato[i].idade >= 18 && strcmp(candidato[i].saude, "boa") == 0) {
                printf("O %s, sexo %c com idade %d e com saude %s esta apto ao servico militar. \n\n",
                       candidato[i].nome, candidato[i].sexo, candidato[i].idade, candidato[i].saude);
            }
            printf("\n\n");
        } // fim do for
        free(candidato);
    } // fim função main()
    
        
    18.03.2014 / 04:46
    -2

    One option would be to use fgets instead of scanf :

        scanf(" %[^\n]s",&candidato[i].nome);
    
        
    15.05.2015 / 19:46