Ronaldo
Ronaldo Desenvolvedor, pai, cidadão do mundo.

Checagem de CPF em C

Checagem de CPF em C

Depois de um longo e tenebroso inverno, eis que resolvi escrever um pequeno código de exemplo que valida um número arbitrário de CPF. Trata-se de um algoritmo muito sacado e praticamente todo programador já teve de implementá-lo alguma vez. Como estava aqui caçando o que fazer, curtindo uma bela gripe e numa noite fria, resolvi relembrar o bom e velho C e escrevi um utilitário simples de linha de comando que valida um CPF qualquer.

Bem, aqui está o código principal:

A função de interesse é a cpfIsValid. Trata-se de um workflow simples que:

  • valida se a entrada é realmente um pointer válido, apesar dessa validação não ser lá muito contundente;
  • valida o tamanho do CPF — ele precisa ter 11 dígitos. Se tiver menos, simplesmente cai fora;
  • verifica se há algum alfa-numérico na string. CPF contém somente dígitos numéricos;
  • verifica se o CPF é composto de números repetidos. Por exemplo, 11111111111 não é um CPF válido mas acaba passando no teste do módulo 11;
  • por fim, extrai os dígitos verificadores do CPF, calcula os dígitos verificadores e checa se são iguais.

O número do CPF é um exemplo de validação cíclica na qual a informação a ser validada contém a própria validação. Isso é algo parecido com o CRC, uma das primeiras formas de validação de dados que era muito usado nas primeiras transmissões de dados nas primeiras redes de computadores.

Existem alguns truques neste código. O primeiro está na função cpfIsValid. O cálculo do dígito verificador é concatenado multiplicando-se o primeiro dígito por 10 e somando-se com o segundo dígito. Esta é uma forma simples de concatenar dígitos no mesmo número, uma característica simples dos números decimais.

O segundo truque está na função checkDigits. Na verdade, esta é uma função cheia de truques. O primeiro é a determinação do tamanho da string fora do loop. Se for feito dentro do loop, strlen será chamado 10 vezes, no pior caso. Assim, determinando ANTES, ampliamos a performance desta pequena função. O outro truque é a conversão de string para inteiro: (cpf[i] — ‘0‘). Um truque conhecido de quem programa em C: calcula-se a distância entre os dígitos e a distância é, evidentemente, o número procurado.

Outro truque interessante, que uso com bastante frequência, é usar os próprios argumentos da função como incremento. Como os argumentos são passados por valor, posso incrementá-los à vontade dentro da função sem risco de bagunçá-los do lado de fora.

Este é um código bastante otimizado. Com um pouco de esforço, certamente você será capaz de otimizá-lo ainda mais. Porém, note que o código não funciona com unicode. Trata-se apenas de uma demonstração simples de como determinar a validade do CPF através de um código C.

O algoritmo aqui apresentado pode ser facilmente portado para outras linguagens. Originalmente, escrevi este código com suporte a unicode em Objective C.

Na próxima coloco uma versão em swift.

Quem quiser ver o código em ação, basta fazer um clone:

https://github.com/ronflima/cpfcheck

No terminal, digite make e fique feliz. Basta ter um compilador C e o utilitário Make que isso compila sem medo.

Originally published at www.ronaldolima.eti.br on May 15, 2015.

By Ronaldo Faria Lima on May 31, 2015.

Canonical link

Exported from Medium on December 25, 2020.