Вы должны проверить, был ли fopen()
успешным, прежде чем получить доступ к файлу, который программа пыталась открыть.
fopen()
возвращает NULL
в случае ошибки.Так что делайте что-то вроде
pass=fopen("password.txt","r");
if( pass==NULL )
{
perror("Unable to open input file.");
}
else
{
// Use the file
}
И gets()
известно о серьезных проблемах безопасности.Смотрите это .
Желательно использовать fgets()
вместо stdin
в качестве аргумента.Поэтому вместо
gets(id);
try
if( fgets(id, sizeof(id), stdin)!=NULL )
{
id[ strlen(id)-1 ] = '\0';
// Use `id`
}
Значение, возвращаемое fgets()
, также проверяется, чтобы убедиться, что fgets()
прошло успешно.Он возвращает NULL
при ошибке.
Следует отметить, что fgets()
будет также читать в конце \n
из стандартного ввода.
Вы можете удалить это дополнительное \n
с помощьюпомощь такой функции, как strlen()
.Смотрите обсуждение удаления лишней новой строки здесь .
Используйте то же самое при чтении в pw
.
Предполагая, что ваш входной файл имеет идентификатор в одномстрока и соответствующий пароль в строке после этого, вы можете сделать что-то вроде
char flag=0;
while(fgets(str, sizeof str, pass)!=NULL && fgets(str2, sizeof str2, pass)!=NULL)
{
str[ strlen(str)-1 ] = '\0';
str2[ strlen(str2)-1 ] = '\0';
if( strcmp(str, id)==0 )
{
flag=1;
if( strcmp(str2, pw)==0 )
{
printf("ACCEPTED\n");
}
else
{
printf("wrong password.");
}
break;
}
}
if(flag==0)
{
printf("Wrong id.");
}
Читать две строки одновременно и проверить, успешны ли обе перед каждой итерацией цикла, чтобы убедиться, что правильные значения были прочитаны.
Возможно, вы захотите выйти из цикла, как только обнаружите, что пароль неверен.
Вы также можете использовать переменную flag, чтобы проверить, был ли введенный идентификатор, действительным, и напечататьсоответствующее сообщение в конце.