Здесь вы печатаете новую строку в пароль
sprintf(codebook, "REG-%d%c%c\n", pass[i], pass[i+2], pass[i + 3]);
Позже вы не сможете ввести эту новую строку в пароль, и, следовательно, сравнение не удастся.
Изменение на
sprintf(codebook, "REG-%d%c%c", pass[i], pass[i+2], pass[i + 3]);
решает проблему.
Чтобы найти такую проблему с пробелами в строках, я рекомендую отладку, напечатав строки, обрамляющие их «невозможными», но печатаемыми символами. Как я рекомендовал в комментарии, я обнаружил проблему, введя некоторые дополнительные отпечатки (или изменив существующие):
В этом случае полезный был непосредственно после проблематики c sprintf()
:
printf("#%s#\n", codebook);