- Не используйте
gets()
. Невозможно безопасно использовать и будет радостно переполнять любые массивы, которые вы ему дадите. Кроме того, более новые версии C удалили его полностью. На GCC и Clang попробуйте скомпилировать с -std=c11
.
- В ваших массивах нет места. Их объявления технически недопустимы в C (у вас не может быть массивов нулевого размера или пустых инициализаторов), но компиляторы, как правило, допускают их как расширения. В любом случае, массивы C не растут динамически, чтобы соответствовать вашим потребностям; C слишком низкий уровень для этого.
- Таким образом,
gets
просто перезаписывает ваш стек тем, что читается. А поскольку эти массивы имеют размер 0, они находятся в том же месте, поэтому второе чтение перезаписывает первое.
Подводя итог, ваша программа демонстрирует много неопределенного поведения, и поэтому вы не можете рассчитывать на то, что она будет делать что-то конкретное.
Вам нужно дать вашим массивам достаточно места для размещения прочитанной строки. Вы должны сказать функции чтения не читать больше, чем у вас есть место. Поскольку это невозможно с gets
, вам нужно использовать fgets
или другую функцию, где возможно .