Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

не получается сделать аутентификацию с файлом в СИ

#c


#include   
#include   

main()  
{  
    FILE *p;  
char buf_login[10];  
char buf_stream[10];  
puts("Login:");  
scanf("%s",buf_login);  
printf("Your login is:%s\n", buf_login);  
p=fopen("12.txt","rt");  
fgets(buf_stream, 10, p);  
fclose(p);  
if (strcmp(buf_stream,buf_login)==0)  
    {  
    puts("OK");  
    }  
 else {  
    puts("error!");  
    }   

}  


Не получается пройти "аутентификацию". В файле 12.txt, к примеру, находится abcd.
Компилирую, ввожу abcd и все равно выкидывает error! вместо ОК. Не могу понять, где
ошибка. Вроде код правильный. Кодировка 12.тхт файла ASCII. Пишу в Borland 2.0, на
виртуалке на Ubuntu.
    


Ответы

Ответ 1



Ошибки могут быть две... Если файл открывается для чтения, то в нем на самом деле не строка "abcd", а строка "abcd\n"(с переводом строки). Убрать можно открыв сам файл в режиме редактирования и при помощи клавиш перемещения курсора и удаления убрать из файла последний непечатный символ (после символа "d"). У Вас должна получиться одна строка без перевода каретки. Файл не открывается, так как не находится в той же директории, откуда и запускается программа. Подтверждением открытия файла должен служить валидный указатель p. В своем коде Вы его не проверяете, но посмотрите хотя бы в отладчике. Хотя скорее всего, в случае отсутствия файла, программа вывалится с ошибкой. Сам же код в принципе рабочий.

Ответ 2



Причина проблемы Вам уже указана - символ '\n' в конце строки в файле "12.txt". Читаем man 3 fgets: fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A terminating null byte ('\0') is stored after the last character in the buffer. Т.е. у Вас в буфере лежит последовательность символов "abcd", после которой лежит символ '\n' и только ПОСЛЕ него уже находится терминатор строки '\0'. А когда Вы считываете логин с клавиатуры с помощью scanf, там символ '\n' в буфер НЕ попадает, поэтому и сравнение не срабатывает - строки разной длины!. Этот лишний символ '\n' легко убрать так: buf_stream[strlen(line)-1] = '\0'; Т.е. просто замазываем ненужный символ '\n' терминатором строки. И, кстати - да, проверять условие открытия файла нужно ОБЯЗАТЕЛЬНО!!!

Ответ 3



Попробуйте ради смеха набрать вашей программе пароль 0987654321 - она свалится из-за переполнения буфера. Функция scanf с форматом %s небезопасна, так как размер буфера она не проверяет. Чуть более безопасный вариант - scanf("%9s",buf); Обратите внимание, что массив у вас на 10 элементов, но вмещается в него 9 символов + маркер конца строки.

Комментариев нет:

Отправить комментарий