Почему при использовании get () дважды в программе для получения входных данных для двух разных массивов возвращается только второй вход, даже для первого массива? - PullRequest
0 голосов
/ 04 мая 2019

Код ниже принимает входные данные дважды и сохраняет их в двух отдельных массивах. При использовании put () для печати этих массивов puts(array1); возвращает то же значение, что и puts(array1);. Почему это происходит?

int main()
{
    char array1[]={};
    char array2[]={};

    printf("Enter String 1: ");
    gets(array1);

    printf("Enter String 2: ");
    gets(array2);

    puts(array1);
    puts(array2);
}

1 Ответ

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

Подводя итог, ваша программа демонстрирует много неопределенного поведения, и поэтому вы не можете рассчитывать на то, что она будет делать что-то конкретное.

Вам нужно дать вашим массивам достаточно места для размещения прочитанной строки. Вы должны сказать функции чтения не читать больше, чем у вас есть место. Поскольку это невозможно с gets, вам нужно использовать fgets или другую функцию, где возможно .

...