Как ограничить функцию scanf в C, чтобы печатать ошибки, когда ввод слишком длинный?
====================================================================================

 Я хочу ограничить функцию scanf, чтобы при вводе, например,`char* array <String...>`, который имеет более 30 символов, он не получит его, и мой вывод будет ошибкой.

 У меня есть подсказка, чтобы использовать [^ n] или что-то в этом роде, но я не понимаю, как это сделать? Я знаю, что я могу использовать`scanf("%30s"..)` но я не хочу, чтобы ввод был действительным, а только ошибка.

 Любая помощь будет отличной.

 `scanf` тогда я считаю, что лучшее, что вы можете сделать, это использовать спецификатор ширины с чем-то вроде:`"%31s"`, как вы уже упоминали, затем используйте`strlen`, чтобы проверить длину ввода, и отбросить строку и сообщить об ошибке, если ввод превышает ваш предел.

 Или, возможно, пропустить`strlen` дополнительно используя`%n` в строке формата, например`"%31s%n"`.

 Строка формата, использующая что-то вроде`%[^\n]` на месте`%s` просто инструктирует функцию продолжать чтение до новой строки, занимая другие пробельные символы по пути. Это полезно, если вы хотите разрешить вводу включать пробельные символы.

 Просмотрите документы для scanf  [Здесь](https://linux.die.net/man/3/scanf) копия справочной страницы).



 [http: //linux.die.net/man/3/sscan](https://linux.die.net/man/3/sscanf) и ищи% П спецификатор формата. Я также рекомендовал бы посмотреть возвращаемое значение функции sscanf, которое сообщит вам количество отформатированных аргументов, а также наличие ошибки.

 Я использовал% П спецификатор формата, помогающий разобрать строку параметров:

 Число символов, отформатированных предыдущими аргументами, сохраняется в переменной Смещение.



 `fgets` а также`sscanf`. С`fgets` вы можете прочитать чуть больше, чем`30` символов, а затем убедитесь, что вы не получили больше, чем`30` символы

 Или, если вы действительно хотите использовать`scanf` используйте это с чем-то большим, чем`30` нравится`%32s`.



 Ну, в C вы можете сделать:

 Очевидно, что вам нужен больший буфер, чтобы сначала получить входные данные, а затем проверить его длину, чтобы массив мог иметь, например, размер. 512 байт. Когда вы копируете в него строки, вам нужно убедиться, что вы получаете 0 в конц



 щих символов.

 Это грубый пример. Если бы это зависело от меня, я бы выделил массив символов максимального размера, прочитал бы всю строку, а затем использовал бы строковые утилиты для подсчета, редактирования и т. Д.



`sscanf`, очень хорошо для такого рода вещей, но осторожный`scanf` тоже может сделать это. Вам нужно убедиться, что вы правильно ограничиваете количество символов, которое может ввести пользователь, поэтому% 31s будет означать, что максимум 30 символов + знак`\0` нулевой терминатор (31).

 То, что вы предотвращаете, это атаки переполнения буфера, которые могут быть чрезвычайно эффективными способами сломать небрежно написанные c-программы. Вот отличная статья Aleph One на BO:[http: //insecure.org/stf/smashstack.htm](http://insecure.org/stf/smashstack.html)