I have this function that is called through a menu of options:
char cad_cliente()//cadastro de clientes
{
char resp;//variavel de resposta se cpf invalido
system("cls");//limpa tela
for(int c = 0; c < MAX ; c++)//para a primeira informação ateh a ultima do vetor, comece a pedir informacoes do cliente e salvar na struct
{
/*
rotina de perguntas para cadastramento
*/
printf("Digite o Cod. de Cliente: ");
scanf("%d",&cd[c].codigo);
fflush(stdin);
printf("Nome: ");
gets(cd[c].nome);
fflush(stdin);
printf("Endereco: ");
gets(cd[c].end);
fflush(stdin);
printf("Telefone: ");
gets(cd[c].tel);
fflush(stdin);
printf("RG: ");
gets(cd[c].rg);
fflush(stdin);
printf("CPF: ");
gets(cd[c].cpf);
fflush(stdin);
char auxCPF = 0;//variavel de controle
/*
crio uma variavel auxiliar de controle para o cpf
onde 0, o cpf não existe, 1 ele checa caractere a caractere de informação
*/
if(strlen(cd[c].cpf) != 11) auxCPF = 1;//se o numero de caracteres digitados na posicao do vetor da struct for diferente de 11, auxcpf = 1 (erro), cpf com tamanho digitado errado
else
auxCPF = verificacpf(cd[c].cpf,11);//senao, chamo a funcao verifica cpf, apos a verificação analiso o retorno de dado
if( auxCPF == 1)//se for 1 (erro)
{
char resp;//crio variavel resp;
while(auxCPF == 1)//e enquanto resp ( ou seja enquanto usuario passar cpf com valor em formato errado ou igual)
{
printf("CPF jah cadastrado, ou formato invalido.");//mensagem de alerta
printf("\nCadastrar outro CPF? [s/n]");//mensagem
scanf("%s",&resp);//aguardo resposta
limpaBuffer();//limpa buffer (alternativa ao fflush)
if(resp != 's' && resp != 'S')//se o usuario decidir não cadastrar, ele volta ao menu de opcoes
return 1;//saio da função e retorno ao menu de opções
gets(cd[c].cpf);//caso decida cadastrar, aguardo o valor a ser digitado
auxCPF = verificacpf(cd[c].cpf,11);//caso contrario a funcao inicia, e o valor de auxCPF recebe a resposta com valor da função verifica cpf
limpaBuffer();//limpa buffer (alternativa ao fflush)
}
}
printf("\nCadastro Efetuado com Sucesso\n");//se nenhum problema for encontrado, cadastra o usuario.
printf("\n----------------------------------------------\n");//quebra de linha
printf("Novo Cadastro? [s/n]");//linha de informação
scanf("%s",&resp);//aguardo resposta
fflush(stdin);//limpo buffer
if(resp == 's' || resp == 'S')//caso escolha cadastrar
{
cad_cliente();//chamo a mesma função
}
else
{
break;//caso contrario, interrompo fluxo de codigo e volto a função que chamou, o menu de opções
}
system("cls");//limpa tela
}
return 0;//se tudo ocorrer de acordo, a função retorna, OK
}
When entering the CPF, the program has 2 outputs
*tratar o numero informado, verificar se o CPF contem 11 caracteres na *string* e comparar, para verificar se os números são iguais, ex: 213, 231, 132,321. E no *return*, ele informa, se o CPF é valido ou se já existe cadastrado na *struct*
--- OR ---
*Se o usuário digitar uma sequência com menos de 11 caracteres, (erro) número menor que o informado por parâmetro, (exibo msg de novo cadastro).
O que acontece é que quando digito o primeiro valor ( $ = 11 caracteres ) a função retorna OK, se eu digitar 9 caracteres, o programa informa que está errado, solicita novo cadastro, e cadastra 2x (isso não entendi o porquê) e não informa se o novo valor que eu digitei (caso seja o segundo cadastro) continua existindo, por isso gostaria de uma orientação a respeito do que pode ser feito.
Outro ponto a se destacar, o meu 'for', começa em 0, faz o cadastro OK, o 'for' vai pra i=1 e cadastra, OK - a partir de então ele não funciona mais.
The function that treats the value entered in the CPF is this:
char verificacpf(char *c_cpf,size_t tamanho)//funcao recebe parametro do cpf digitado, com o tamanho do vetor
{
/*checar primeiramente se o valor eh um numero de acordo com a tabela ASCII
Então apartir dai começo a comparar os numeros com STRCMP*/
char aux;//variavel auxiliar de retorno de dado
for(int f = 0; f < tamanho; f++)//ciclo de checagem de cpf, de 0 até o valor do tamanho da string informado por parametro
{
if(c_cpf[f] < 48 || c_cpf[f] > 58)//verifico se é um numero atravez do codigo da tabela ascii
{
aux = 1;//se for aux recebe 1 e recebe o proximo valor de cpf
continue;
}else
{
aux = 0;//cpf diferente, passa a proxima consulta
}
}
if(aux == 1) return 1; // sai da função, (erro) cpf com problema
aux = 0;//caso contrario, eu zero a variavel aux.
for(int i = 0; i < MAX; i++)//ciclo de comparação de todos os cpfs cadastrados
{
for(int e = 0; e < tamanho;e++)//ciclo de verificacao de caractere a caractere da string do cpf
{
if(cd[i].cpf[e] != c_cpf[e] )//se cada algarismo do cpf cadastrado na struct for diferente do cpf passado como referencia
{
aux = 1;//aux recebe 1,
break;//erro, retorno a funcao que chamou
}else{
aux = 0;//aux recebe 1, tudo oK
}
}
if(aux == 0)//se aux tudo OK
break;//não preciso continuar
}
return aux;//retorno o valor encontrado por aux.
}