|
SubtlePrintf
Коварный printf().
Featured Коварный printf()Вчера подорвался на ерунде как ребенок. Сижу, отлаживаю новый онлайновый ассемблер в своем эмуляторе Радио-86РК. Под отладкой понимается ёрзанье с применением html'я. Для сборки финального html-файла из кучи мелких у меня написана примитивная программа. Вот ее фрагмент: ...
while (!feof(f)) {
char line[1024];
*line = 0;
fgets(line, sizeof(line), f);
printf(line);
}
...Подразумевается, что данный код прострочно копирует данные из файла f на стандарный вывод. Даже если отставить в сторону использование буфера с константной длиной и прочих "штучек" языка С, этот код имеет одну проблему, которая стоила мне сомнений в наличии сознания. До каких-то пор все работало отлично, но как только я начал использовать процентные значения для широт и высот в html, начались странности. Получалось, что вместо, например: <table width="100%"> на выходе было: <table width="100"> Вы, наверное, уже догадались, в чем тут дело. Но, признаюсь, я искал проблему минут тридцать. Вместо: printf(line); надо писать: printf("%s", line);А иначе все процентные символы будут расцены как указатели форматов, ибо первый параметр printf() - это не просто строка, а формат, и в случае их неэкранирования будут уделены, что и происходило в моем случае. Вывод (который следует после начального "сам дурак"): Лучше писать на С++ и использовать потоки для форматного вывода. Лирическое отступление. Кстати, онлайновый ассемблер очень огранично вписался в эмулятор. Спасибо Вячеславу Славинскому за оригинальный код этого ассемблера. Особенно меня радует возможность автоматической фоновой компиляции. Теперь можно, прямо не отходя от эмулятора, переключиться в ассемблер, написать что-нибудь на диалекте Intel 8080 (КР580), скомпилировать и загнать прямо в эмулятор.
|