Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Smatcher

Problema com função

Recommended Posts

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;
}

Share this post


Link to post
Share on other sites
pmg

Qual e a definicao de USER?


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other 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;

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.