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

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

11.08.2008 17:28:56
6 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

5
23.05.2017 12:13:34
Для g, 4 имеет эффект: если строка короче 4 символов, она будет дополнена пробелами (слева).
R.. GitHub STOP HELPING ICE 17.07.2010 20:18:47

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

б. Не уверен

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

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

е. 1 персонаж

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

0
11.08.2008 17:33:50

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

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

5
23.05.2017 12:01:23

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

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

3
11.08.2008 18:38:58

Вот мой учебник по printf: http://www.pixelbeat.org/programming/gcc/format_specs.html

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

4
18.09.2008 00:24:53
Я случайно наткнулся на этот учебник несколько месяцев назад и сразу же добавил в закладки. Я использовал это совсем немного с тех пор. Спасибо, что нашли время собрать это вместе!
SiegeX 5.12.2009 07:31:04

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

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

0
20.09.2008 19:25:49
Или вы можете использовать QString :: sprintf, который является частью класса QString и «поддерживает большинство спецификаторов преобразования, предоставляемых printf () в стандартной библиотеке C ++».
David Dibben 2.10.2008 13:17:00