Вы можете использовать эту функцию:
blockquote>
send_static_file(filename)
Функция, используемая для отправки статических файлов из статической папки в браузер.app = Flask(__name__) @app.route('/<path:path>') def static_file(path): return app.send_static_file(path)
scanf()
зло - используйте fgets()
, а затем анализируйте.
Деталь не в том, что scanf()
совершенно плох.
1) Спецификаторы формата часто используются слабым образом
char buf[100];
scanf("%s", buf); // bad - no width limit
2) Возвращаемое значение ошибочно не проверяется
scanf("%99[\n]", buf); // what if use entered `"\n"`?
puts(buf);
3) Когда ввод не такой, как ожидалось , не ясно, что остается в stdin
.
if (scanf("%d %d %d", &i, &j, &k) != 3) {
// OK, not what is in `stdin`?
}
у вас могут возникнуть проблемы, если вы попытаетесь смешать вызовы scanf с вызовами getchar или getline.
blockquote>Да. Многие
scanf()
вызовы оставляют завершающий'\n'
вstdin
, которые затем читаются как пустая строкаgetline(), fgets()
.scanf()
не не для чтения строк .getline()
иfgets()
гораздо лучше подходят для чтения строки .
Сильно ли изменился scanf с тех пор, как были написаны приведенные выше цитаты?
blockquote>Только так много изменений может произойти без путаницы в кодовой базе. @Джонатан Леффлер
scanf()
остается проблематичным.scanf()
не может принять аргумент (после формата), чтобы указать, сколько символов нужно принять в пункт назначенияchar *
.Некоторые системы добавили дополнительные опции формата, чтобы помочь.
Фундаментальная проблема заключается в следующем:
Пользовательский ввод зло . Более надежно получить ввод текста за один шаг, квалифицировать ввод, затем проанализировать и оценить его успех, чем пытаться сделать все это в одной функции.
Безопасность
Слабость
scanf()
и плохая тенденция кодераscanf()
были золотым прииском для хакеров.IMO, C не имеет надежного набора функций пользовательского ввода.