Вопрос

Я работаю над тем, чтобы перенести старый код 1998 года в XXI век.Одним из первых шагов в этом процессе является преобразование операторов printf в QСтрока переменные.Однако независимо от того, сколько раз я оглядываюсь на printf, я всегда забываю то одно, то другое.Итак, ради интереса, давайте вместе, в память о старых временах, раскодируем и по ходу дела создадим первые маленькие 'праймер для печати' для 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 цифра после десятичной запятой
в.шестнадцатеричный, минимум 4 символа, дополненный 0, буквы печатаются в верхнем регистре
д.то же, что и выше, но минимум 2 символа
е.Предполагается, что e представляет собой целое число, преобразованное в беззнаковый символ и напечатанное.
ф.то же, что и е
г.Вероятно, это опечатка, цифра 4 не имеет никакого эффекта.Если бы это был "%.4s", то было бы напечатано максимум 4 символа строки.Интересно отметить, что в этом случае строку не обязательно завершать нулем.

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

Другие советы

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

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

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

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

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

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

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

б.Не уверен

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

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

е.1 персонаж

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top