Забавный баг :-) scanf() начинает обработку введенной строки, после того как нажат Enter. При этом, судя по всему, символы переводы строки (0x0D и/или 0x0A) остаются в буфере ввода и с ними работает gets(). gets заканчивает прием данных после обнаружения этих байт. Как-то так, думаю. Но не нашел описания такой особенности у scanf(). Пробуйте везде scanf() вместо gets()