2016-05-17 2 views
-3

Я пытаюсь сделать простую аутентификацию пользователя и пароля в C. Мне сказали, что никогда не используйте gets() при вводе данных, и вместо этого я должен использовать fgets(). Но я не уверен, как работает fgets() или почему дает мне этот ввод. Вот код.Простой пароль-приглашение в C

#include <stdio.h> 
#include <string.h> 

int login(char *user, char *passwd){ 

    int enter = 0; 
    char p[6]; 
    char u[6]; 
    printf("User: "); 
    fgets(u, sizeof u, stdin); 
    printf("Pass: "); 
    fgets(p, sizeof p, stdin); 
    printf("%s\n", p); 
    if (strcmp(user, u) == 0 && strcmp(passwd, p) == 0){ 
     enter = 1; 
    } 
    return entrar; 
} 

int main(){ 
    char user[] = "admin"; 
    char passwd[] = "12345"; 
    if (login(user, passwd)){ 
     puts("--ACCESS GRANTED--"); 
    } 
    else{ 
     puts("--Wrong pass or user--"); 
    } 
    return 0; 
} 

Ouput

Пользователь: администратор

Pass:

--Wrong проход или user--

Он даже не позволил мне войти в пароль после нажатия кнопки ввода.

+1

«читает символы из потока и сохраняет их в качестве C string в str до тех пор, пока не будут прочитаны символы (num-1) или не будет достигнута новая строка или конец файла, в зависимости от того, что произойдет раньше. '. Прекратите подсчет бобов. Если вам понадобятся текстовые буферы, просто объявите [128] (если не хватает ОЗУ). Пытаться к буферам точного размера просто вызовет вам ошибки, входные вызовы, возвращающиеся раньше, символы новой строки, оставшиеся во входных потоках, такие вещи .. –

+0

Что произойдет, если у вас есть система («ПАУЗА») или getch() между fgets()? Я бы предположил, что, поскольку пароль пропускается, как только вы нажмете enter, он потребляет линию и использует ее для массива u [] и p []. – schil227

+1

иметь в виду: (1) fgets хранит '\ n' в выходном буфере, (2) если вся строка ввода не помещается в выходной буфер, следующий вызов' fgets' будет читаться больше из той же строки, поэтому он не будет ждать –

ответ

1

Проблема заключается в размере вашего символа [], если вы установите его на 6, «admin» будет переполняться, так как чтение с помощью gets будет читать дополнительные символы.

Попробуйте с большей строки, я уверен, что вы можете себе это позволить, скажем:

char u[10]; 
char p[10]; 

И это еще довольно скуп;)