Декодирование операторов printf в C (Printf Primer)
Вопрос
Я работаю над тем, чтобы перенести старый код 1998 года в XXI век.Одним из первых шагов в этом процессе является преобразование операторов printf в QСтрока переменные.Однако независимо от того, сколько раз я оглядываюсь на printf, я всегда забываю то одно, то другое.Итак, ради интереса, давайте вместе, в память о старых временах, раскодируем и по ходу дела создадим первые маленькие 'праймер для печати' для Stackoverflow.
В коде я наткнулся на эту маленькую жемчужину,
printf("%4u\t%016.1f\t%04X\t%02X\t%1c\t%1c\t%4s", a, b, c, d, e, f, g);
Как будут отформатированы переменные a, b, c, d, e, f, g?
Решение
Дэнни во многом прав.
а.десятичное число без знака, минимум 4 символа, дополненное пробелом
б.с плавающей запятой, минимум 16 цифр перед десятичной запятой (дополненный 0), 1 цифра после десятичной запятой
в.шестнадцатеричный, минимум 4 символа, дополненный 0, буквы печатаются в верхнем регистре
д.то же, что и выше, но минимум 2 символа
е.Предполагается, что e представляет собой целое число, преобразованное в беззнаковый символ и напечатанное.
ф.то же, что и е
г.Вероятно, это опечатка, цифра 4 не имеет никакого эффекта.Если бы это был "%.4s", то было бы напечатано максимум 4 символа строки.Интересно отметить, что в этом случае строку не обязательно завершать нулем.
Редактировать: jj33 указывает на 2 ошибки в пунктах b и g выше здесь.
Другие советы
@Джейсон Дэй, я думаю, что 4 в последних %4s имеет значение, если в нем меньше 4 символов.Если их больше 4, вы правы, %4s и %s будут одинаковыми, но с менее чем 4 символами в g %s будет выровнено по левому краю, а %4s будет выровнено по правому краю в поле из 4 символов.
b на самом деле составляет минимум 16 символов для всего поля, включая десятичную и одну цифру после десятичной запятой, я думаю (всего 16 символов против 18 общих символов)
Вот мой учебник по printf:http://www.pixelbeat.org/programming/gcc/format_specs.html
Я всегда компилируюсь с -блэдом с GCC, который будет предупреждать о любых несоответствиях между предоставленными форматами печати и переменными.
@jj33, ты абсолютно прав по обоим пунктам.
#include <stdio.h>
int main(int argc, char *argv[]) {
char *s = "Hello, World";
char *s2 = "he";
printf("4s: '%4s'\n", s);
printf(".4s: '%.4s'\n", s);
printf("4s2: '%4s'\n", s2);
printf(".4s2: '%.4s'\n", s2);
return 0;
}
$ gcc -o foo foo.c
$ ./foo
4s: 'Hello, World'
.4s: 'Hell'
4s2: ' he'
.4s2: 'he'
Хороший улов!
а.десятичная дробь, четыре значащие цифры
б.Не уверен
в.шестнадцатеричный, минимум 4 символа
д.Также шестнадцатеричный, минимум 2 символа
е.1 персонаж
ф.Строка символов, минимум 4
Что вам действительно нужно, так это инструмент, который принимает строки формата в операторах printf() и преобразует их в эквивалентные вызовы функций на основе QString.
Хочет ли кто-нибудь потратить время, потраченное на пожертвования бесплатного программного обеспечения, на разработку такого инструмента?
Заполнитель для URL-адреса службы хостинга бесплатного программного обеспечения, содержащей исходный код такого инструмента.