#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 символов + маркер конца строки.
Комментариев нет:
Отправить комментарий