По предположению, scanf()
не потреблял новую строку, которую вам нужно было набрать, чтобы он мог обработать десять целых чисел, которые вы хотели получить перед строкой.Таким образом, после последнего вызова scanf()
, gets()
сталкивается с входным буфером, который начинается с новой строки.Presto, он выполнил свою спецификацию, поэтому ничего не копирует в свой буфер и возвращает.
В общем, scanf()
и gets()
- плохой выбор для нового кода.У них обоих есть проблемы, которые делают их болезненными при правильном использовании или даже опасными при использовании вообще.
В частности, gets()
не проверяет и не может проверить размер своего выходного буфера, поэтому он легко перезапишет любую память, расположенную после его буфера.В этом заключается порча глобального состояния или стека.Если это стек, то можно использовать это, чтобы получить контроль над программой и заставить ее выполнять произвольный код.Это не очень хорошая вещь.
Было бы лучше использовать ваш входной поток с fgets()
, который имеет ограничение на размер буфера, и анализировать его с sscanf()
и другими функциями после прочтения.