Printing bug

Asked

Viewed 74 times

1

Someone could 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;
}

2 answers

3

CPF is not a number is a description composed by digits, is not a number, especially is not a array with 10 integers, it doesn’t make any sense, it could even do if it were a long, but would still be wrong because CPF is not a number.

Change in the ficha for char cpf[12] (source) and then you can keep the number, there in the printf() change to %s.

Behold CPF or CNPJ field type in VARCHAR or INT database?.

There are other minor errors in the code, or others bigger than I even paid attention.

0


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

Browser other questions tagged

You are not signed in. Login or sign up in order to post.