Вопросы | c

Декодирование операторов printf в C (Printf Primer)

Вопрос

CodingWithoutComments | 3107 просмотров | рейтинг: 0

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



Ответы

jj33

+ 0 -
а. десятичный, четыре значащих цифры б. Точно сказать не могу с. гекс, минимум 4 символа д. Также гекс, минимум 2 символа е. 1 персонаж е. Строка символов, минимум 4  


Jason Day

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


pixelbeat

+ 5 -
@ Джейсон Дэй, я думаю, что 4 в последнем% 4s значимы, если есть менее 4 символов. Если вы правы больше чем 4,% 4s и% s были бы одинаковыми, но с менее чем 4 символами в g% s были бы выровнены по левому краю, а% 4s были бы выровнены по правому краю в поле из 4 символов. На самом деле b - это минимум 16 символов для всего поля, включая десятичную и одну цифру после десятичной дроби (я думаю, 16 общих символов против 18 общих символов)  


Omer Zak

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

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


TheSmurf

+ 4 -
Вот мой учебник для начинающих: http://www.pixelbeat.org/programming/gcc/format_specs.html Я всегда компилирую с -Wall с GCC, который предупредит о любых несоответствиях между форматы и переменные printf.  


Anonymous

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


Теги

c | qt | printf | qstring