2008-08-11 9 views
4

Я работаю над приведением старого кода с 1998 года до 21-го века. Одним из первых шагов процесса является преобразование операторов printf в переменные QString. Независимо от того, сколько раз я снова смотрю на printf, я всегда забываю одно или другое. Итак, для удовольствия, давайте расшифруем его вместе, для того, чтобы определить время и в процессе создаем первый маленький 'printf primer' для Stackoverflow.Декодирование выводов printf в C (Printf Primer)

В коде, я наткнулся на этот небольшой драгоценный камень,

printf("%4u\t%016.1f\t%04X\t%02X\t%1c\t%1c\t%4s", a, b, c, d, e, f, g); 

Как переменные а, б, в, г, д, е, ж быть отформатирован?

ответ

5

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

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

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

+0

Для 'G', 4 имеет эффект: если строка короче 4-х символов будут пробелами (слева). –

0

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

b. Не определено

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

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

e. 1 знак

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

5

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

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

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' 

Хорошо поймать!

4

Вот мой Printf праймер: http://www.pixelbeat.org/programming/gcc/format_specs.html

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

+0

Я случайно встретил это праймер несколько месяцев назад и сразу же добавил в закладки. С тех пор я использовал его немного. Спасибо, что нашли время, чтобы собрать его вместе! – SiegeX

0

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

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

+1

Или вы можете использовать QString :: sprintf, который является частью класса QString и «поддерживает большинство спецификаторов преобразования, предоставляемых printf() в стандартной библиотеке C++». –

 Смежные вопросы

  • Нет связанных вопросов^_^