Código para Validar CPF

1. Código para Validar CPF

Daniel Marchi
DMS_

(usa elementary OS)

Enviado em 01/05/2013 - 21:48h

Boa Noite, estou tentando fazer um código pra validar CPF, até ai tudo bem, nesta minha primeira etapa quero digitar o CPF completo com 11 digitos, em seguida informar o cpf digitado e armazenar os dois ultimos digitos em um vetor e mostrar na tela estes dois ultimos digitos. Estou com o erro na hora de imprimir os dois ultimos digitos, creio que estou usando o argumento errado "%d" ele imprimi um numero totalmente diferente, "%c" ele não imprimir nada, "%s" ele informa segmentation fault.

#include <stdio.h>
#include <math.h>

int main()
{

int vet[9] = {10, 9, 8, 7, 6, 5, 4, 3, 2};
int cpf[10];
int cpfDig[2];

//digitando o CPF a ser validado e informando o CPF digitado
printf("Por favor, digite o seu cpf\n");
scanf("%11[^\n]d", cpf);
printf("\nCPF digitado: %s\n", cpf);

//armazenando os digitos verificadores em um vetor separado
cpfDig[0]=cpf[8];
cpfDig[1]=cpf[9];


//o erro acontece nestas duas linhas abaixo.
printf("\nO primeiro digito verificador é : %c\n", cpfDig[0]);
printf("\nO segundo digito verificador é : %c\n", cpfDig[1]);


}



  


2. Re: Código para Validar CPF

Paulo Dias
di4s

(usa XUbuntu)

Enviado em 01/05/2013 - 22:44h

tente declarar cpf[11]


3. Re: Código para Validar CPF

Daniel Marchi
DMS_

(usa elementary OS)

Enviado em 01/05/2013 - 22:56h

prmjunior escreveu:

tente declarar cpf[11]


Da na mesma...


4. Re: Código para Validar CPF

wellington
wellingtonsr

(usa Slackware)

Enviado em 01/05/2013 - 23:03h

Tente isso:


char cpf[11];
char cpfDig[2];



5. Re: Código para Validar CPF

Fernando
phoemur

(usa Debian)

Enviado em 01/05/2013 - 23:14h

Eu fiz um código simples no mês passado, se quiser dar uma olhada:

http://www.vivaolinux.com.br/script/Validar-CPF-em-C-esse-funciona

Está funcionando direitinho...


6. Re: Código para Validar CPF

Paulo Dias
di4s

(usa XUbuntu)

Enviado em 01/05/2013 - 23:31h

fiz algumas alterações no seu codigo e assim funciona. se ficar com duvida pode perguntar


#include <stdio.h>
#include <math.h>

int main()
{

int vet[9] = {10, 9, 8, 7, 6, 5, 4, 3, 2};
char cpf[12];
int cpfDig[2];

//digitando o CPF a ser validado e informando o CPF digitado
printf("Por favor, digite o seu cpf\n");
scanf("%s", &cpf);
printf("\nCPF digitado: %s", cpf);

//armazenando os digitos verificadores em um vetor separado
cpfDig[0]=cpf[9] - 48;
cpfDig[1]=cpf[10] - 48;


//o erro acontece nestas duas linhas abaixo.
printf("\nO primeiro digito verificador é : %d\n", cpfDig[0]);
printf("\nO segundo digito verificador é : %d\n", cpfDig[1]);

}




7. Re: Código para Validar CPF

Fernando
phoemur

(usa Debian)

Enviado em 01/05/2013 - 23:36h

cpfDig[0] é inteiro e cpf[9]é char, você não está fazendo o casting da conversão, será que não pode ser isso?

experimenta:

cpfDig[0]=(int)cpf[9] - 48;
cpfDig[1]=(int)cpf[10] - 48;

(Edit: o colega já resolveu...)


8. Re: Código para Validar CPF

Daniel Marchi
DMS_

(usa elementary OS)

Enviado em 02/05/2013 - 14:53h

Legal, agradeço a todos, hj a tarde irei tentar os respectivos conselhos, quanto ao código pronto, não queria olhar não, se não fica fácil, quero tentar fazer do 0 mesmo, mas obrigado mesmo assim.

[]'s


9. Re: Código para Validar CPF

Daniel Marchi
DMS_

(usa elementary OS)

Enviado em 02/05/2013 - 17:43h

prmjunior escreveu:

fiz algumas alterações no seu codigo e assim funciona. se ficar com duvida pode perguntar


#include <stdio.h>
#include <math.h>

int main()
{

int vet[9] = {10, 9, 8, 7, 6, 5, 4, 3, 2};
char cpf[12]; //Por que precisa ser Char e não int?, mais pra frente vou precisar multiplicar esses valores com o vet[9], não vai dar problema?
int cpfDig[2];

//digitando o CPF a ser validado e informando o CPF digitado
printf("Por favor, digite o seu cpf\n");
scanf("%s", &cpf);
printf("\nCPF digitado: %s", cpf);

//armazenando os digitos verificadores em um vetor separado
cpfDig[0]=cpf[9] - 48; //Por que colocou - 48 nessas duas linhas, não entendi
cpfDig[1]=cpf[10] - 48;


//o erro acontece nestas duas linhas abaixo.
printf("\nO primeiro digito verificador é : %d\n", cpfDig[0]);
printf("\nO segundo digito verificador é : %d\n", cpfDig[1]);

}


Fiz alguns comentários no código acima.
Por que o Char cpf[12] e não cpf[11] se o cpf possui 11 digitos?

E logo abaixo, por que -48? Sinceramente não entendi /s

cpfDig[0]=cpf[9] - 48;
cpfDig[1]=cpf[10] - 48;




10. Re: Código para Validar CPF

Paulo Dias
di4s

(usa XUbuntu)

Enviado em 02/05/2013 - 19:57h

DMS_ escreveu:


Fiz alguns comentários no código acima.
Por que o Char cpf[12] e não cpf[11] se o cpf possui 11 digitos?

E logo abaixo, por que -48? Sinceramente não entendi /s

cpfDig[0]=cpf[9] - 48;
cpfDig[1]=cpf[10] - 48;



eae cara, assim:

usei tamanho 12 porque (se n estou enganado) o scanf le tudo que é digitado, nesse caso 11 char's para o cpf mais o 'enter'.

O (cpf[9] - 48) digamos que seja uma conversão para inteiro. se um char for colocado em uma variavel inteira ela fica com o numero decimal correspondente a essa char na tabela ascii:

veja a tabela: http://pt.wikipedia.org/wiki/ASCII

o char 0(zero) tem o numero decimal igual a 48 na tabela ascii
o char 9 tem o numero decimal igual a 57 na tabela ascii

ex. quando o char é 9 o valor que vai para inteiro é 57, então:


cpfDig[0] = 57 - 48;




11. Re: Código para Validar CPF

Daniel Marchi
DMS_

(usa elementary OS)

Enviado em 02/05/2013 - 19:59h

Boa Noite pessoal,

Eu já declarei o vetor cpf e atribui um cpf, fazendo desse jeito, eu consigo chegar ao primeiro digito verificador, agora se eu altero, e deixo para o usuário inserir o CPF, tenho várias problemas, os números informados não batem fica uma zona!

Comentei a linha em que o usuário insere o CPF, pois quando ela está ativa, os número são impressos totalmente errado, é algo com formato de exibição, enfim, não consigo resolver isso, somente deste modo deu certo, declarando o cpf de início, como feito no vetor cpf[11]


#include <stdio.h>
#include <math.h>

int main()
{
int digito1;
int resto;
int total=0;
int i;
int vetMult[9];
int vet[9] = {10, 9, 8, 7, 6, 5, 4, 3, 2};
int cpf[11]= {2, 2, 2, 3, 3, 3, 6, 6, 6, 3, 8};
int cpfDig[2];


//digitando o CPF a ser validado e informando o CPF digitado
printf("Por favor, digite o seu cpf\n");
// scanf("%s", &cpf);
printf("\nCPF digitado: %c\n", cpf);

//armazenando os digitos verificadores em um vetor separado
cpfDig[0]=cpf[9];
cpfDig[1]=cpf[10];

printf("\nO primeiro digito verificador é : %d\n", cpfDig[0]);
printf("\nO segundo digito verificador é : %d\n\n", cpfDig[1]);

//multiplicandos os valores do cpf[9] pelo vet[9]
for (i=0; i<9; i++)
{
printf("%d x %d = ", cpf[i], vet[i]);
vetMult[i]=(cpf[i])*vet[i];
printf("%d\n", vetMult[i]);
total= total+vetMult[i];
printf("O total é: %d\n", total);
}
printf("O Total da somas das posições é: %d\n", total);

//Coletando o resto da divisão do total da soma das posições multiplicadas
resto=(total%11);
printf("Resto é : %d\n", resto);

//determinando o primeiro digito verificador: digito1
if (resto<2) digito1=0;
else digito1=11-resto;

if (digito1==cpfDig[0]) {
printf("O primeiro digito está correto\n");
}
else printf("O primeiro digito está incorreto\n");
printf("O primeiro digito verificador é: %d\n", digito1);

}


@EDIT
Então pessoal eu consegui, o que acontece é o seguinte, declarando o vetor como char, por padrão a ultima posição é sempre um \o, logo, um vetor char de 12 posições, apenas 11 posições podem ser preenchidas em vista que por padrão a ultima é '\o' o byte nulo, feito isto tudo deu certo, claro tive que fazer aquele casting de -48, qual eu não entendi até agora


12. Re: Código para Validar CPF

Paulo Dias
di4s

(usa XUbuntu)

Enviado em 02/05/2013 - 20:02h

você usou scanf("%s", &cpf)

mas o cpf é um vetor de inteiros. o %s serve para ler uma string, ou seja um vetor de char. eu usaria cpf como um vetor de char



01 02