Я работаю над доведением старого кода с 1998 до 21 века. Одним из первых шагов в этом процессе является преобразование операторов printf в переменные QString . Независимо от того, сколько раз я оглядываюсь назад на printf, я всегда забываю одно или другое. Итак, для забавы, давайте расшифруем его вместе, ради времени ole и в процессе создадим первый маленький 'printf primer' для 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 цифра после десятичной дроби
c. шестнадцатеричное, минимум 4 символа, 0 дополняется, буквы печатаются в верхнем регистре
d. то же, что и выше, но минимум 2 символа
e. Предполагается, что e является int, преобразованным в unsigned char и напечатанным
f. так же, как
например Вероятно, это опечатка, 4 не имеет никакого эффекта. Если бы это было "% .4s", то было бы напечатано максимум 4 символа из строки. Интересно отметить, что в этом случае строка не должна заканчиваться нулем.
а. десятичный, четыре значащих цифры
б. Не уверен
с. гекс, минимум 4 символа
д. Также гекс, минимум 2 символа
е. 1 персонаж
е. Строка символов, минимум 4
@ Джейсон Дей , я думаю, что 4 в последнем% 4s значимы, если есть менее 4 символов. Если вы правы больше чем 4,% 4s и% s были бы одинаковыми, но с менее чем 4 символами в g% s были бы выровнены по левому краю, а% 4s были бы выровнены по правому краю в поле из 4 символов
На самом деле b - это минимум 16 символов для всего поля, включая десятичную и единственную цифру после десятичной дроби (16 общих символов против 18 общих символов)
@ 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'
Хороший улов!
Вот мой учебник по printf: http://www.pixelbeat.org/programming/gcc/format_specs.html
Я всегда компилирую с -Wall с gcc, который будет предупреждать о любых несоответствиях между предоставленными форматами printf и переменными.
Что вам действительно нужно, так это инструмент, который берет строки формата в операторах printf () и преобразует их в эквивалентные вызовы функций на основе QString.
Кто-нибудь хочет потратить свое Время пожертвования свободных программ на разработку такого инструмента?
Заполнитель для URL-адреса хостинг-службы Free Software, содержащий исходный код такого инструмента
g
, 4 имеет эффект: если строка короче 4 символов, она будет дополнена пробелами (слева).