для проверки ввода является числовым (с плавающей точкой)
blockquote>1) Принять ввод в виде строки
char buf[Big_Enough]
. Я ожидаю, что 160 цифр будут обрабатывать все, кроме самых загадочных «плавающих» строк 1 sup>.#define N 160 char buf[N]; if (fgets, buf, sizeof buf, stdin) {
2) Применить
float strtof()
дляfloat
, (strtod()
дляdouble
,strtold()
дляlong double
).char *endptr; errno = 0; float d = strtof(buf, &endptr); // endptr now points to the end of the conversion, if any.
3) Проверить результаты.
if (buf == endptr) return "No_Conversion"; // Recommend to tolerate trailing white-space. // as leading white-spaces are already allowed by `strtof()` while (isspace((unsigned char)*endptr) { endptr++; } if (*endptr) return "TrailingJunkFound"; return "Success";
4) Испытания на крайности, если необходимо.
В этот момент ввод является числовым. Остается вопрос, хорошо ли «конечная строка» может быть представлена конечной
float
: если a the | result | находится в диапазоне0
или[FLT_TRUE_MIN...FLT_MAX]
.Это включает в себя рассмотрение
errno
.Преобразование «успешно», но конечные строковые значения вне диапазона
float
становятсяHUGE_VALF
, которые могут быть бесконечностью илиFLT_MAX
.Wee | значения | близко к 0.0, но не 0.0 становится чем-то в диапазоне
[0.0 ... INT_MIN]
.Так как цель состоит в том, чтобы определить, успешно ли выполнено преобразование (оно имело место), я оставлю эти подробности для вопроса, который хочет узнать о том, какое значение .
Альтернативой является использование
fscanf()
для непосредственного чтения и преобразования, однако обработка ошибок там тоже имеет свои проблемы, которые трудно контролировать.1 sup> Типичный диапазон
float
составляет +/- 10 38 sup>. Таким образом, учет 40 или более символов имеет смысл. Точный точный отпечатокFLT_TRUE_MIN
может содержать ~ 150 символов. Чтобы отличить произвольно строку «float» отFLT_TRUE_MIN
от следующей, более крупной, нужно примерно столько цифр.Если «плавающие» строки не являются произвольными, а поступают только с выходных данных напечатанного
float
, тогда требуется намного меньше цифр - около 40.Конечно, разумно предусмотреть дополнительные начальные / конечные пробелы и нули.
Я работаю над приложением, где разработчики следовали за ужасным путем, Вы исследуете. Это слушает назад дни, когда необходимо было записать собственный ISAPI dlls, это выложило HTML-код. Это - постоянная головная боль для работы в. Если Ваш код является главным образом строками, то что-то неправильно.
Большая часть кода этого типа, который я изменяю, я инстанцирую серверный объектов, настраиваю их свойства, как желаемый и затем говорю им.RenderControl (устройство записи). Это делает код намного легче читать и работать с. Если существует хит производительности из издержек, это приносит, я готов принять его (на самом деле, приложение обычно работает быстрее после того, как я внес свои изменения, таким образом, анекдотическим образом это не имеет место, но я не представил свой код).
Один простой недостаток к жесткому кодированию, которое - Ваш материал в строках, когда стандарты HTML изменяются. Код я продолжаю работать, был написан в 04/05, и с тех пор <BR> стал <br/> и прописные теги HTML больше не является кошерным и т.д. Если они использовали управление сервером, то управление сервером изменило свой произведенный HTML без нас бывший должный сделать что-либо. Это - всего один простой пример.
Править: О, и btw, BeginRender и EndRender не имеют никакой реализации. Они - заполнители для Вас, чтобы переопределить и обеспечить пользовательскую функциональность в HtmlTextWriter-производном-классе.
EDIT2: Иногда это немного обременительно, чтобы всегда использовать управление сервером, как для контейнеров и материала. Я сделал бы много.Controls. Добавьте () и затем представьте контейнер позже. Таким образом, иногда я делаю это:
writer.AddAttribute(HtmlTextWriterAttribute.Class, "myContainerClass");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
// do some stuff, .RenderControl on some other controls, etc.
writer.RenderEndTag();
Как упомянуто, это представит корректный HTML, даже если HTML отделения изменится в будущем, вызовите, у меня нет трудно кодированных строк.
Мудрый производительностью, это потребует, чтобы было сделано больше строковых копий. HtmlTextWriter
записи непосредственно к буферу вывода. StringBuilder
с другой стороны, имеет его собственный буфер. Когда Вы звоните ToString
на StringBuilder
, новая строка должна быть создана, и затем она будет записана в буфер вывода output.Write
. Это требует, чтобы намного больше работы было сделано.
Я не думаю, что необходимо называть BeginRender/EndRender, это сделано страницей.
Я не вижу, как использование строкового разработчика сохранило бы любую работу по использованию HtmlTextWriters собственные методы.