#include #include #include /* time() */ #include /* isdigit() */ int *criar_cpf(void); int validar_cpf(const int *const cpf); int *converter(const char *s); int verificar_argv(const char *s); int main(int argc, char **argv) { int *cpf; if (argc < 2 || *(*(argv+1)+1) == 'h') { fprintf(stderr, "Uso:\n"); fprintf(stderr, "-h mostra esta mensagem\n"); fprintf(stderr, "-c cria um numero de CPF\n"); fprintf(stderr, "-v valida um numero de CPF\n"); exit(-1); } else { if (*(*(argv+1)+1) == 'c') { int i; cpf = criar_cpf(); for (i = 0 ; i < 11 ; i++) printf("%d", cpf[i]); putchar('\n'); } else if (*(*(argv+1)+1) == 'v') { if (verificar_argv(*(argv+2)) == 1) { fprintf(stderr, "ERRO: Erro no terceiro argumento!\n"); fprintf(stderr, "ERRO: Entre somente com 11 digitos\n"); exit(-1); } cpf = malloc(sizeof(int) * 11); cpf = converter(*(argv+2)); printf("CPF %svalido\n", validar_cpf(cpf) == 1 ? "" : "in"); } else return 1; free(cpf); } return 0; } int *criar_cpf(void) { int soma = 0, i, *vetor; vetor = malloc(sizeof(int)*11); srand(time(NULL)); for (i = 0 ; i < 9 ; i++) { vetor[i] = rand() % 9; soma += vetor[i] * (10 - i); } vetor[9] = (soma % 11 < 2 ? 0 : 11 - (soma % 11) ); soma = 2 * vetor[9] + 3 * vetor[8] + 4 * vetor[7] + 5 * vetor[6] + 6 * vetor[5] + 7 * vetor[4] + 8 * vetor[3] + 9 * vetor[2] + 10 * vetor[1] + 11 * vetor[0]; vetor[10] = (soma % 11 < 2 ? 0 : 11 - (soma % 11) ); return vetor; } int validar_cpf(const int *const cpf) { int i, soma = 0, onze_digitos(int *cpf); if (onze_digitos((int *)cpf) == 0) return 0; for (i = 0 ; i < 9 ; i++) soma += cpf[i] * (10 - i); if (cpf[9] == (soma % 11 < 2 ? 0 : 11 - (soma % 11))) { soma = 0; for (i = 0 ; i < 10 ; i++) soma += cpf[i] * (11 - i); if (cpf[10] == (soma % 11 < 2 ? 0 : 11 - (soma % 11))) return 1; } return 0; } int onze_digitos(int *cpf) { int i; for (i = 0 ; i < 11 ; i++) if (!isdigit(cpf[i])) return 0; return 1; } int *converter(const char *s) { int i, *c; c = malloc(sizeof(int) * 11); for (i = 0 ; i < 11 ; i++) c[i] = s[i] - '0'; return c; } int verificar_argv(const char *s) { int i; for (i = 0 ; i < 11 ; i++) if (isdigit(s[i]) == 0) return 1; return 0; }