То, почему, получает функцию, столь опасную, что она не должна использоваться?

Я принимаю как разработчик, у Вас есть определенная степень административного управления над Вашей машиной. Если так, из командной строки, выполняет msconfig.exe. Можно удалить много процессов из ровного запуска, таким образом, избавив от необходимости уничтожить их с вышеупомянутыми решениями.

210
задан JL2210 8 June 2019 в 14:11
поделиться

4 ответа

Для использования получает безопасно, вы должны точно знать, сколько символов вы будете читать, чтобы вы могли сделать свой буфер достаточно большим. Вы узнаете только то, что точно знаете, какие данные вы будете читать.

Вместо использования gets , вы хотите использовать fgets с подписью

char* fgets(char *string, int length, FILE * stream);

( fgets , если он читает всю строку, оставит '\ n' в строке, вам придется с этим разобраться. он был официально удален стандартом 2011 года. Большинство реализаций C по-прежнему поддерживают его, но по крайней мере gcc выдает предупреждение для любого кода, который его использует.

161
ответ дан 23 November 2019 в 04:35
поделиться

Невозможно удалить функции API без нарушения работы API. Если бы вы могли, многие приложения перестали бы компилироваться или запускаться вообще.

Это причина того, что одна ссылка дает:

Чтение строки, которая выходит за пределы массив, на который указывает s, приводит к неопределенное поведение. Использование fgets () рекомендуется.

6
ответ дан 23 November 2019 в 04:35
поделиться

Поскольку получает , не выполняет никаких проверок при получении байтов из stdin и их размещении. Простой пример:

char array1[] = "12345";
char array2[] = "67890";

gets(array1);

Теперь, прежде всего, вам разрешено вводить, сколько символов вы хотите, получает не заботится об этом. Во-вторых, байты, превышающие размер массива, в который вы их поместили (в данном случае array1 ), перезапишут все, что они найдут в памяти, потому что gets запишет их. В предыдущем примере это означает, что если вы введете "abcdefghijklmnopqrts" , возможно, непредсказуемо он перезапишет также array2 или что-то еще.

Функция небезопасна, поскольку предполагает согласованный ввод. НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ЕГО!

21
ответ дан 23 November 2019 в 04:35
поделиться

Недавно я прочитал в сообщении USENET на comp.lang.c , что gets () удаляется из стандарта . УУХУ

Вам будет приятно узнать, что комитет только что проголосовал (единогласно, поскольку оказывается) удалить gets () из также черновик.

4
ответ дан 23 November 2019 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: