Zadanie z haslem

Odpowiedz Nowy wątek
2019-02-11 21:27
0

Cześć,
Napisałem program, który maskuje hasło w jezyku C, ale mam mały problem - otóż wyskakuje komunikat segmentation fault.
Czy mógłby ktoś wyjaśnić co robię źle?

#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

#define TIME 10
#define PASSWORD "pass123"

void sigalrm_handler() {
    printf("\nERR: Czas uplynal...\n");
    exit(1);
}

int main(int argc, char * argv[]) {
    char password[9];
    printf("Wpisz haslo, masz na to %d sekund: ", TIME);
    signal(SIGALRM, sigalrm_handler);
    alarm(TIME);
    fflush(stdout);
    for(int i=0; i<9; i++)
    {
        password[i] = getch();
        printf('*');
    }

    if (strcmp(password, PASSWORD) == 0) {
        printf("Haslo poprawne!\n");
        exit(0);
    } else {
        printf("ERR: Haslo niepoprawne\n");
        exit(2);
    }

    pause();
    return 0;
}
edytowany 1x, ostatnio: FrankySanky, 2019-02-11 21:38

Pozostało 580 znaków

2019-02-11 21:30
kq
0

Nie kompilowałem, ale strzelam, że to przez to, że masz za małą tablicę i nigdzie nie kończysz stringa.

char password[10] = {0};

To powinno wystarczyć, ale powinieneś też przestać wczytywać hasło po wciśnięciu enter:

    for(int i=0; i<9; i++)
    {
        password[i] = getch();
        printf('*');
        if(password[i] == '\n')
            break;
    }

Pozostało 580 znaków

2019-02-11 21:33
0
kq napisał(a):

Nie kompilowałem, ale strzelam, że to przez to, że masz za małą tablicę i nigdzie nie kończysz stringa.

char password[10] = {0};

To powinno wystarczyć, ale powinieneś też przestać wczytywać hasło po wciśnięciu enter:

    for(int i=0; i<9; i++)
    {
        password[i] = getch();
        printf('*');
        if(password[i] == '\n')
            break;
    }

Niestety, dalej to samo.
Jedynie wszystko działa poprawnie, gdy wczytam hasło poprzez scanf, ale nie wiem jak wtedy zakryć hasło.

edytowany 1x, ostatnio: FrankySanky, 2019-02-11 21:35

Pozostało 580 znaków

2019-02-11 21:41
kq
0

Wyłącz echo w terminalu. Nie mam pod ręką kodu jakiego sam kiedyś użyłem, ale to powinno być pomocne:
http://man7.org/tlpi/code/online/book/tty/no_echo.c.html

Dziwne, że nadal się wywala - w którym miejscu się to dzieje?


Pozostało 580 znaków

2019-02-11 21:50
0
kq napisał(a):

Wyłącz echo w terminalu. Nie mam pod ręką kodu jakiego sam kiedyś użyłem, ale to powinno być pomocne:
http://man7.org/tlpi/code/online/book/tty/no_echo.c.html

Dziwne, że nadal się wywala - w którym miejscu się to dzieje?

Przy wpisywaniu w terminalu wartości.

Już sprawdzam link

Pozostało 580 znaków

2019-02-11 22:01
kq
0

Ach, jasne:

printf('*');

'*' to znak, a printf() oczekuje tablic znaków. Popraw na

printf("*")

edytowany 1x, ostatnio: kq, 2019-02-11 22:01

Pozostało 580 znaków

2019-02-12 00:04
2

Masz jeszcze jeden drobny problem - w handlerze sygnału nie wolno używać exit.
https://stackoverflow.com/que[...]xit-fail-to-terminate-process

Pozostało 580 znaków

2019-02-12 20:36
0

Panowie,
Na pewno dobrze rozpisałem kod?

Samo to:

 for(int i=0; i<9; i++)
    {
        password[i] = getch();
        printf('*');
        if(password[i] == '\n')
            break;
    }

Wypluwa mi gwiazdki, nawet jeśli nic nie wpiszę do terminala.
Jeśli robię jakiś banalny błąd to przepraszam.

Pozostało 580 znaków

2019-02-12 20:38
kq
0

printf('*'); na pewno masz '? Bo to nie ma prawa działać z '


Pozostało 580 znaków

2019-02-14 12:53
0

Okej,
Wyłączyłem ECHO i było nawet okej, jedynie coś nie chciało sprawdzić czy znak jest enterem i musiałem dopisywać kolejne znaki, aż pętla dojdzie do końca przedziału.

Napisałem funkcję getch() <-- Na linuxie nie było takowej

Teraz śmiga ładnie, ale jest jedno 'ALE'...
Teraz chciałbym dodać coś takiego jak usuwanie "*" z terminala jeśli do ifa wejdzie '\b'.
Mógłby ktoś mnie naprowadzić?

edytowany 1x, ostatnio: FrankySanky, 2019-02-14 12:53

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0