Это потому, что fgets
читает максимум 80-1 = 79 символов (оставляет 1 символ, который становится нулевым завершением), но прекращает чтение после перевода строки \n
, который добавляется к stdin
после вы набираете "замечательно" и нажимаете ввод. Он копирует этот символ \n
в ваш буфер, поэтому входная строка на самом деле "wonderful\n\0"
, что не соответствует имеющимся у вас данным из-за перевода строки.
Теперь, когда вы объявляете вместо размера буфера 10, fgets
не имеет места для хранения \n
, но все равно null завершает строку - поэтому он работает случайно.
scanf
, с другой стороны, оставляет \n
в stdin
без чтения, поэтому scanf
также работает. Тем не менее, fgets
- лучшая и безопасная функция, поэтому вы должны продолжать ее использовать.
Быстрое решение состоит в том, чтобы сделать что-то вроде:
fgets(search_for, 80, stdin);
search_for[strlen(search_for)-1] = '\0';
find_track(search_for);
Это перезаписывает \n
с помощью нулевой терминатор. После fgets у вас есть "wonderful\n\0"
в памяти, а затем search_for[strlen(search_for)-1] = '\0';
меняет это на "wonderful\0\0"
.
Обратите внимание, что для правильной программы, вы также должны добавить обработку ошибок:
if(fgets(search_for, 80, stdin) != NULL)
{
search_for[strlen(search_for)-1] = '\0';
find_track(search_for);
}