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.
Exported from Medium on December 25, 2020.