Ir ao conteúdo
  • Cadastre-se

C Verificador de Digitos do CPF


Posts recomendados

Olá boa tarde!

 

Gostaria de uma ajuda no código abaixo! É um verificador dos dígitos do CPF, o programa esta funcionando com números de 11 dígitos, mas ao informar números com mais dígitos ou com dígitos sequencias (444444444444, 66666666666) ele informa que o código é válido. Alguém que conheça a lógica de verificação do CPF, pode me indicar o que deve implementar para inibir este erro!

 

#include <stdio.h>

int main()
{
    char cpf[12];
    int icpf[12];
    int i,somador=0,digito1,result1,result2,digito2,valor;
    
    printf("Digite o CPF: ");
    scanf(" %s",cpf);

    for(i=0; i<11; i++)
    {
        icpf[i]=cpf[i]-48;
    }

    for(i=0; i<9; i++)
    {
        somador+=icpf[i]*(10-i);
    }

    result1=somador%11;

    if( (result1==0) || (result1==1) )
    {
        digito1=0;
    }

    else
    {
        digito1 = 11-result1;
    }

    somador=0;

    for(i=0; i<10; i++)
    {
        somador+=icpf[i]*(11-i);
    }

    valor=(somador/11)*11;
    result2=somador-valor;

    if( (result2==0) || (result2==1) )
    {
        digito2=0;
    }

    else
    {
        digito2=11-result2;
    }

    if((digito1==icpf[9]) && (digito2==icpf[10]))
    {
        printf("\nEste CPF e valido!.\n");
    }
    else
    {
        printf("CPF Invalido e/ou problemas com os digitos.\n");
    }
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

@userpc_2020

6 horas atrás, userpc_2020 disse:

o programa esta funcionando com números de 11 dígitos, mas ao informar números com mais dígitos ou com dígitos sequencias (444444444444, 66666666666) ele informa que o código é válido.

Vá em uma calculadora de dígito verificador. Para o CPF 444.444.444, o DV é 44, e para o CPF 666.666.666 o DV é 66, então, se seu programa diz que o CPF é válido quando se insere 444444444444 e 666666666666, não está totalmente errado... Se você quer verificar um CPF, saiba que ele tem 11 dígitos, nenhum a mais, para isso, use %11s ao invés de %s para pedir o CPF. Se forem digitados mais do que 11 dígitos, ele pega só os 11 primeiros, mas saiba que o certo é imprimir uma mensagem de erro pedindo para digitar o CPF novamente, pois o usuário poderia ter errado ao digitá-lo.

Você não comentou nada em seu programa, se coloque em meu lugar, de tentar entender o programa de alguém do 0, e ainda mais se houver algum erro, é bem chato.

Não sei a lógica que você usou para o segundo dígito, mas deveria ser idêntica à lógica para o primeiro, exceto que a constante que vai multiplicar os dígitos do CPF começa no número 11 ao invés do 10, e no final soma-se digito1*2.

#include <stdio.h>
#include <locale.h>

int main()
{
    setlocale (LC_ALL, "Portuguese");
    char cpf[12];
    int icpf[12];
    int i,somador=0,digito1,result1,result2,digito2,valor;
    
    printf("Digite o CPF: ");
    scanf("%11s", cpf);

    /*Primeiro dígito verificador*/
    for(i=0; i<11; i++) {
        //Converter char para int
        icpf[i]=cpf[i]-48;
    }

    for (i=0; i<9; i++){
        //Multiplicar CPF pelas constantes do primeiro dígito
        somador+= icpf[i]*(10-i);
    }
    result1= somador%11;

    //Obter primeiro dígito
    if(result1 <= 1) {
        digito1=0;
    } else {
        digito1 = 11-result1;
    }
    
    /*Segundo dígito verificador*/
    somador=0;
    for (i=0; i<9; i++){
        //Multiplicar CPF pelas constantes do segundo dígito
        somador+= icpf[i]*(11-i);
    }
    somador += digito1*2;

    result2= somador%11;
    
    //Obter segundo dígito
    if(result2 <= 1) {
        digito2=0;
    } else {
        digito2= 11-result2;
    }

    //Verificar CPF válido
    if((digito1==icpf[9]) && (digito2==icpf[10]))
    {
        printf("\nEste CPF é válido!\n");
    }
    else
    {
        printf("CPF Inválido e/ou problemas com os digitos.\n");
    }
    return 0;
}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!