2013-06-19 2 views
1

Я пытаюсь получить некоторое форматирование, сделанное в моем операторе sprintf, но он не работает так, как я ожидаю. Вот строка:Получение правильного форматирования с помощью sprintf()

n = sprintf(buffer, "x = %d.%d, y = %d.%d, z = %d.%d \n", x1, x2, y1, y2, z1, z2); 

В этой распечатке x1 является целая часть числа, и х2 дробная часть. Все было бы хорошо, за исключением того, что мне нужно набивать x2, y2 и z2, чтобы всегда было 2 цифры - это означает, что мне нужно прокладывать начальные нули.

С примерами, которые я вижу в Интернете, кажется, как делают это должно работать:

n = sprintf(buffer, "x = %d.%02d, y = %d.%02d, z = %d.%02d \n", x1, x2, y1, y2, z1, z2); 

Однако, что вместо производит что-то вроде этого:

x = 2.2d, y = 37.2d, z = 2.2d 

37 выше на самом деле x2, и по-видимому, переместился вместо y1. Я попытался поставить скобки вокруг «02», но это ничего не делает.

Я попытался раскалывается период тоже вроде этого: (но это не сработало)

n = sprintf(buffer, "x = %d. %02d, y = %d. %02d, z = %d. %02d \n", x1, x2, y1, y2, z1, z2); 

Я не совсем уверен, что это неправильно ... Я бы признателен за любую помощь. Это не особенно важно делать в sprintf (я мог бы теоретически написать некоторые инструкции «if» и заставить его работать таким образом), но было бы неплохо.

Спасибо!

+0

Работает правильно здесь. Возможно, вы случайно набрали 'O' вместо' 0' в конверсиях? [Надуманный, я знаю] –

+0

@ DanielFischer, ну это копия, вставленная из моего кода, и я думаю, что они 0s. Я еще раз проверил: P Я как бы взломал вместе функцию быстрой замены для этого, но мне было бы интересно узнать, почему это все равно не работает. – Mewa

+0

Хорошо, если это копия, ваш формат правильный. Он работал с копией, здесь, поскольку визуальный осмотр сказал, что это должно быть. Итак, какой компилятор (и реализация библиотеки) вы используете? Похоже, что он не реализует все флаги. Из любопытства, что он делает с '% d.% 2d'? Это прокладка? –

ответ

1

Это пример кода и вывод.

float x1 = 10.12222; 
float y1 = 20.23333; 
float z1 = 30.34444; 
int xi = 10; 
int yi = 20; 
int zi = 30; 
int x0 = 5; 
int y0 = 5; 
int z0 = 5; 
int xl = 10; 
int yl = 10; 
int zl = 10; 
char chr[512]; 

printf("x = %5.2f, y = %5.2f, z = %5.2f\n", x1, y1, z1); 
printf("x = %10d, y = %10d, z = %10d\n", xi, yi, zi); 
printf("x = %010d, y = %010d, z = %010d\n", xi, yi, zi); 
printf("x = %-10d, y = %-10d, z = %-10d\n", xi, yi, zi); 
printf("x = %10.5d, y = %10.5d, z = %10.5d\n", xi, yi, zi); // DYNAMIC 

/* Dynamic formatting of DYNAMIC commented line*/ 
sprintf(chr, "Dynamic: x = %%%d.%dd, y = %%%d.%dd, z = %%%d.%dd\n", 
     xl, x0, yl, y0, zl, z0); 
printf(chr, xi, yi, zi); 

Выход будет таким.

x = 10.12, y = 20.23, z = 30.34 
x =   10, y =   20, z =   30 
x = 0000000010, y = 0000000020, z = 0000000030 
x = 10  , y = 20  , z = 30 
x =  00010, y =  00020, z =  00030 
Dynamic: x =  00010, y =  00020, z =  00030 

% x.yd означает,

х - Всего символов для целого числа.

y - Прокладка с 0s в пределах этой длины.

% 10.5d даст следующие результаты на 10, 100, 1000, 10000, 100000, 100000

bbbbbbbbbb => Spaces 
    00010 
    00100 
    01000 
    10000 
    100000 
    1000000 

Я надеюсь, что это помогает для форматирования.

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