Однако с моим кодом есть две проблемы:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
...
do{
system("cls");
printf("\nEnter username: ");
gets(username);
printf("\nEnter password: ");
do{
password[i] = getch();
if (password[i] != '\r')
printf("*");
i++;
}while(password[i-1] != '\r');
password[i-1] = '\0';
if (strcmp(username, "dlsuuser1") == 0 & strcmp(password, "dlsuuser") == 0)
indicator = 0;
else if (strcmp(username, "dlsuuser2") == 0 && strcmp(password, "dlsuusers") == 0)
indicator = 0;
else{
printf("\nInvalid username or password!");
memset(password, '\0', sizeof(password));
memset(username, '\0', sizeof(username));
getch();
i=0;
indicator = 1;
}
}while(indicator != 0);
printf("\nLogged in successfully!");
Я пытался следить за источниками в Интернете, но, похоже, не смог этого получить. Я тоже новичок в C. Также у меня есть теория по поводу второй проблемы; где программа продолжает создавать массив для имени пользователя и пароля (например, добавляется сам к себе, как работает strcat). Спасибо тем, кто ответит!
Кроме того, если кто-нибудь покажет мне, как сократить и сделать код более эффективным, я буду очень признателен! (Примечание. Это действие, в котором нам разрешено выполнять только базовый ввод-вывод, лестничный if-else, операторы переключения, функции, за исключением функций, передаваемых по ссылке, любые операторы цикла, массивы и строки. В этом случае возможности могут быть ограничены. Прошу прощения.)
Я пробовал memset, strcpy (пароль, "") и пароль[0]=\0, но ничего не помогло.
Кроме того: gets()
устарел и больше не является частью стандартной библиотеки C. Пожалуйста, прочитайте Почему функция Gets настолько опасна, что ее нельзя использовать?
Не сбрасывайте i
после использования. Сделайте это прямо перед этим. То же самое и с indicator
.
Кроме того, ваш первый вызов strcmp()
использует побитовое И (&
) вместо логического И (&&
). Нет предупреждений компилятора?
Публикуйте программу, а не фрагмент.
Вам следует пометить эти окна, поскольку вы используете специальные заголовки Windows и внешние команды.
for(int i = 0;;) {
password[i] = getch();
if (strchr(password[i], "\b\n\r")) {
if (password[i] == '\r')
break;
continue;
}
i++;
}
&
вместо логического и &&
. Поскольку у вас одно и то же действие, можно объединить два теста: if (
(!strcmp(username, "dlsuuser1") && !strcmp(password, "dlsuuser")) ||
(!strcmp(username, "dlsuuser2") && !strcmp(password, "dlsuusers"))
)
Следующим шагом рефакторинга будет сохранение учетных данных в структуре данных, чтобы избежать дублирования кода.
1) не вводите
getch()
непосредственно в массивpassword
. Сохраните введенные данные во временной переменной, проверьте эту временную переменную на наличие'\r'
и возврата (и других проблемных входных данных), прежде чем решить, что делать дальше.