Расшифровка операторов printf в C (Printf Primer)

Я работаю над тем, чтобы перенести старый код из 1998 года в 21 век. Одним из первых шагов в этом процессе является преобразование операторов printf в переменные QString . Независимо от того, сколько раз я оглядываюсь на printf, я всегда забываю то или иное. Итак, для удовольствия, давайте расшифруем его вместе, ради простоты, и в процессе создадим первый небольшой «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?

Ответов (6)

Решение

Дэнни в основном прав.

а. беззнаковое десятичное число, минимум 4 символа, дополненное пробелами
b. с плавающей запятой, минимум 16 цифр перед десятичной дробью (с дополнением 0), 1 цифра после десятичной дроби
c. шестнадцатеричный, минимум 4 символа, 0 с заполнением, буквы печатаются в верхнем регистре
d. То же, что и выше, но минимум 2 символа
e. Предполагается, что e - это int, преобразованный в беззнаковый char и напечатанный
f. так же, как
например, Скорее всего, это опечатка, цифра 4 не действует. Если бы это было «% .4s», то было бы напечатано максимум 4 символа из строки. Интересно отметить, что в этом случае строка не должна заканчиваться нулем.

Edit: jj33 баллов из 2 ошибки в б и г выше здесь .

@ Джейсон Дэй , я думаю, что 4 в последних% 4 значимы, если их меньше 4 символов. Если их больше 4, вы правы,% 4s и% s будут одинаковыми, но с менее чем 4 символами в g% s будет выровнен по левому краю, а% 4s будет выровнен по правому краю в поле из 4 символов.

b на самом деле составляет минимум 16 символов для всего поля, включая десятичную и единственную цифру после десятичной дроби, я думаю (всего 16 символов против 18 общих символов)

а. десятичный, четыре значащих цифры

б. Не уверен

c. шестнадцатеричный, минимум 4 символа

d. Также шестнадцатеричный, минимум 2 символа

е. 1 персонаж

f. Строка символов, минимум 4

@ 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-адреса службы хостинга бесплатного программного обеспечения, содержащей исходный код такого инструмента.