Ir para o conteúdo
Smatcher

Problema com função

Mensagens Recomendadas

Smatcher

Boas, criei a seguinte função mas está com um problema, até inserir a primeira vez uma nova password funciona corretamente, a partir daí aceita sempre uma nova password mesmo que insira incorretamente a password antiga, alguem me pode ajudar?

USER changeData(USER user) {
    USER tmpUser;
    char op;
    char nome[MAX_SIZE];
    char pw[MAX_SIZE];
    char newPw[MAX_SIZE];
    int size;

    tmpUser = user;
    while (op != 'c') {
        LIMPAR;
        printf("Deseja alterar:\n\n\t\ta)Nome\n\t\tb)Password\n\t\tc)Voltar ao menu anterior\n\n\n");
        printf("Escolha: ");
        printf("%s", tmpUser.pw);
        scanf("%c", &op);
        getchar();
        switch (op) {

            case 'a':
                printf("Nome desejado: ");
                fgets(nome, MAX_SIZE, stdin);
                size = strlen(nome);
                nome[size - 1] = '\0';
                
                printf("Insira a palavra passe para confirmar a alteracao: ");
                fgets(pw, MAX_SIZE, stdin);
                size = strlen(pw);
                pw[size - 1] = '\0';

                if (strcmp(pw, tmpUser.pw) == 0) {
                    printf("\nNome alterado com sucesso!\n");
                    tmpUser.nome = nome;
                } else {
                    printf("\nPassword Invalida\n");
                }

                break;
            case 'b':
                
                printf("Nova password: ");
                fgets(newPw, MAX_SIZE, stdin);
                size = strlen(newPw);
                newPw[size - 1] = '\0';
                
                printf("Insira a antiga palavra passe para confirmar a alteracao: ");
                fgets(pw, MAX_SIZE, stdin);
                size = strlen(pw);
                pw[size - 1] = '\0';


                if (strcmp(pw, tmpUser.pw) == 0) {
                    printf("\nPassword alterada com sucesso!");
                    tmpUser.pw = newPw;

                } else {
                    printf("\nPassword Invalida");
                }
                break;
            case 'c':

                break;
            default:

                printf("Opcao Invalida\n");
                break;
        }

    }

    return tmpUser;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Cr4zYPT

Tipo não sei se a memoria e alocada manualmente, mas aqui em vez de trocares os apontadores tentar copiar mesmo a string.

tmpUser.pw = newPw;

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Smatcher

Aqui está a struct USER:

typedef struct user {
    int indice;
    int id;
    int userType;
    char *pw;
    char *nome;
} USER;

tipo, eu estou a trabalhar com um user só, toda a informaçao que eu altero aqui fica no loged user so quando faço logout e que passo para o array...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Cr4zYPT

tipo quando fazes fgets a nova a password a string para onde e guardada e alocada pela função logo "apagada" quando sais da função. Aloca a memoria para a str pw da struct e copia mesmo a string

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Smatcher

Tipo, a função funciona corretamente até alterar a password a 1ª vez com sucesso, a partir daí é que aceita sempre a nova password...

Não sabes nenhuma solução para isto? :S

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flinger

typedef struct user {
    int indice;
    int id;
    int userType;
    char *pw;
    char *nome;
} USER;

muda para

typedef struct user {
    int indice;
    int id;
    int userType;
    char pw[MAX_SIZE];
    char *nome;
} USER;

e

tmpUser.pw = newPw;

para

strcpy(tmpUser.pw,newPw)

Devias fazer o mesmo ao nome. Andas guardar apontadores para endereços de variáveis locais, que podem ser reescritos quando sais da função changeData.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.