Index of Vector in C

Asked

Viewed 178 times

0

I have this function which 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 typing 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 handles the value typed 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.
}
  • 1

    Take a look at [mcve]

  • will help paka this ae in. Ball show, was thinking of destroying everything and redo the 0, I will try to reassemble, pq not to fill the same problem.

  • What’s your question? I don’t understand why you asked the question

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.