Декодирование операторов printf в C (Printf Primer) - PullRequest
4 голосов
/ 11 августа 2008

Я работаю над доведением старого кода с 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?

Ответы [ 6 ]

5 голосов
/ 11 августа 2008

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

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

5 голосов
/ 11 августа 2008

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

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

Редактировать: jj33 указывает на 2 ошибки в b и g выше здесь .

4 голосов
/ 18 сентября 2008

Вот мой учебник для начинающих printf: http://www.pixelbeat.org/programming/gcc/format_specs.html

Я всегда компилирую с -Wall с gcc, который предупредит о любых несоответствиях между форматы и переменные printf.

3 голосов
/ 11 августа 2008

@ 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'

Хороший улов!

0 голосов
/ 20 сентября 2008

Что вам действительно нужно, так это инструмент, который берет строки формата в выражениях printf () и преобразует их в эквивалентные вызовы функций на основе QString. Кто-нибудь хочет потратить свое Время пожертвований свободных программ на разработку такого инструмента?

Заполнитель для URL-адреса хостинг-службы бесплатного программного обеспечения, содержащий исходный код такого инструмента

0 голосов
/ 11 августа 2008

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

б. Не уверен

с. гекс, минимум 4 символа

д. Также гекс, минимум 2 символа

е. 1 символ

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

...