Bug in print

1

Could someone answer me because in cpf is printing the value 6422276?

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

typedef struct{
int dia;
int mes;
int ano;
}data;

typedef struct{
char nome[100];
data nascimento;
int cpf[10];
}ficha;

ficha *preenche(ficha *ponteiro){
//NOME
printf("NOME:\n");
fgets(ponteiro->nome,100,stdin);
setbuf(stdin,0);

//data de nascimento
printf("DATA DE NASCIMENTO: <dia><mes><ano> \n");
scanf("%d %d %d",&ponteiro->nascimento.dia,&ponteiro- 
>nascimento.mes,&ponteiro->nascimento.ano );
setbuf(stdin,0);

//CPF
printf("CPF:\n");
scanf("%d", &ponteiro->cpf);

return ponteiro;
}


void imprimi(ficha *ponteiro){
printf("NOME>>>%s\n", ponteiro->nome);

printf("DATA DE NASCIMENTO>>> <%d><%d><%d> \n", ponteiro- 
>nascimento.dia,ponteiro->nascimento.mes,ponteiro->nascimento.ano);

printf("CPF>>>>%d\n",ponteiro->cpf);

}

int main() {
ficha pessoa;
ficha *p;
p=&pessoa;

p=preenche(p);
imprimi(p);

return 0;
}
    
asked by anonymous 04.07.2018 / 01:55

2 answers

1

The type of CPF can be a string, or a vector of chars with size 11 + 1 .

A CPF number is made up of 11 digits, its buffer must have a minimum size of 12 elements to be able to retain a CPF, where the last element is to accommodate the fgets() terminator. p>

See:

#define CPF_TAM_MAX     (11)
#define NOME_TAM_MAX    (100)

typedef struct {
    char nome[ NOME_TAM_MAX + 1 ];
    data nascimento;
    char cpf[ CPF_TAM_MAX + 1 ];
} ficha;

Now, change the line:

scanf( "%d", &ponteiro->cpf );

To:

scanf( "%s", ponteiro->cpf );
When reading a line with \n , the end-of-line character \r and / or %code% are not removed from the end of the buffer:

fgets( ponteiro->nome, 100, stdin );

Include the next line to safely remove them :

ponteiro->nome[ strcspn(ponteiro->nome, "\r\n") ] = 0;

Put it all together:

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

#define CPF_TAM_MAX     (11)
#define NOME_TAM_MAX    (100)

typedef struct {
    int dia;
    int mes;
    int ano;
} data;


typedef struct {
    char nome[ NOME_TAM_MAX + 1 ];
    data nascimento;
    char cpf[ CPF_TAM_MAX + 1 ];
} ficha;


void preencher(ficha *ponteiro)
{
    printf("NOME: ");
    fgets( ponteiro->nome, NOME_TAM_MAX, stdin );
    ponteiro->nome[strcspn(ponteiro->nome, "\r\n")] = 0;
    setbuf( stdin, 0 );

    printf("DATA DE NASCIMENTO (DD MM AAAA): ");
    scanf("%d %d %d",&ponteiro->nascimento.dia,&ponteiro->nascimento.mes,&ponteiro->nascimento.ano );
    setbuf(stdin,0);

    printf("CPF: ");
    scanf( "%s", ponteiro->cpf);
}


void imprimir(ficha *ponteiro)
{
    printf("NOME: %s\n", ponteiro->nome );
    printf("DATA DE NASCIMENTO: %02d/%02d/%04d\n", ponteiro->nascimento.dia, ponteiro->nascimento.mes, ponteiro->nascimento.ano );
    printf("CPF: %s\n", ponteiro->cpf );
}

int main( void )
{
    ficha pessoa;
    preencher( &pessoa );
    imprimir( &pessoa );
    return 0;
}

Testing:

NOME: Fulano de Tal
DATA DE NASCIMENTO (DD MM AAAA): 03 07 2018
CPF: 00011122299
NOME: Fulano de Tal
DATA DE NASCIMENTO: 03/07/2018
CPF: 00011122299
    
04.07.2018 / 03:06
4

CPF is not a number is a description made up of numbers, not a number, especially not an array with 10 integers, this does not make the slightest sense, it could even do if it were a long , but would still be wrong because CPF is not a number.

Change from ficha to char cpf[12] ( source ) and you can save the CPF there, there printf() change to %s .

See Type of the CPF or CNPJ field in the VARCHAR or INT database .

There are other minor errors in the code, or others that I did not even pay attention to.

    
04.07.2018 / 02:02