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