The guy from CPF
can be a string, or an array of chars
sized 11 + 1
.
A CPF number is composed of 11
digits, your buffer needs to be at least 12
elements to be able to retain a CPF, where the last element serves to accommodate the terminator \0
.
Look at that:
#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 fgets()
, the line end character \n
and/or \r
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;
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