Электроника и радиотехника => Цифровая техника => Тема начата: Nikopol от 11 Авг., 2020, 18:07
Название: Изучаю Си (функция strcmp)
Отправлено: Nikopol от 11 Авг., 2020, 18:07
Функция strcmp предназначена для сравнения строковых массивов Вот пример имеем код: он работает и при вводе правильного пароля "pass" вывод в консоль: При неправильном бесконечно просит ввести пароль.
Но я подумал, что использование fscanf при вводе пароля не правильно т.к. может привести к переполнению буфера и краху программы.
Вот:
Сначала был введён неправильный пароль превышающий длину массива, а после правильный, но массив уже был расширен и при чтении сработала защита от переполнения буфера.
[свернуть]
Поэтому я взял функцию fgets которая проверяет размер массива. и код стал такой:
Но почему то он перестал принимать пароль хотя если после ввода пароля вставить: то вывод показывает, что пароль записан в массив правильно:
Подскажите, что не так?
Название: Re: Изучаю Си (функция strcmp)
Отправлено: Shaman от 11 Авг., 2020, 18:12
Просто функция "fgets" для записи в массив ожидает символ переноса строки '\n' и записывает его в массив в месте с ранее введёнными символами, при условии, что введённая информация помещается в длину массива. В противном случае записывается максимально возможное количество символов. Вот и получается, что в массив с предзаписанным паролем содержит 'pass', а с вводимым 'pass\n' и естественно они никогда не совпадут. И это видно если внимательно проанализировать вывод и листинг программы:
В выводе мы видим, что после слова 'pass' происходит перенос строки В противном случае вывод бы выглядел так:
А в коде перенос строки отсутствует
Дополнение
Если уж быть совсем точным то на самом деле данные в массивах выглядят так: 'pass\0' и 'pass\n\0' соответственно. Символ \0 означает конец строки и всегда вносится в массив. При задании размера массива это следует учитывать.