2013-04-29 3 views
0

Я использую Sprintf для формирования строки в C.форматирует строку, используя Sprintf в с

мне нужно вставить «+» и «-» знак перед тем значением с плавающей точкой.

Этот положительный и отрицательный знаки вставляются путем проверки флага после этого, когда я вставляю значение поплавка.

Теперь я хочу сделать это целое число в правильном выравнивании вместе с положительным или отрицательным знаком.

В настоящее время это моя отформатированная строка:

+300.00 
-200.00 
+34.60 

Я хочу, чтобы результат, как следующее,

+300.00 
+233.45 
-20.34 

Я написал следующий код:

char printbuff[1000], flag = 1; 
double temp=23.34, temp1= 340.45; 

sprintf(printBuff, "%c%-lf\n%c%-lf", 
     (Flag == 1) ? '+' : '-', 
     temp, 
     (Flag == 1) ? '+' :'-', 
     temp1); 

я получаю следующий вывод:

+23.34 
+340.45 

Вместо желаемого:

+23.45 
+340.45 

Как я могу это сделать?

+4

[Whathaveyoutried.com] (http://mattgemmell.com/2008/12/08/what-have-you-tried/)? –

+1

Вы отметили два языка: вам нужен C-ответ или C++? – Angew

+0

Я хочу C ответить. –

ответ

0

Вам нужно что-то вроде:

char str[1000]; 
double v = 3.1415926; 
sprintf(str, "%+6.2f", v); 

+ указывает на "показать знак".

Более полный фрагмент кода:

#include <stdio.h> 

int main() 
{ 
    double a[] = { 0, 3.1415, 333.7, -312.2, 87.8712121, -1000.0 }; 
    int i; 
    for(i = 0; i < sizeof(a)/sizeof(a[0]); i++) 
    { 
     printf("%+8.2f\n", a[i]); 
    } 

    return 0; 
} 

Выход:

+0.00 
    +3.14 
+333.70 
-312.20 
    +87.87 
-1000.00 

Очевидно, что использование Sprintf, будет буфер вовлечен, но я считаю, что это показывает решение более легко.

+0

Мне любопытно, почему это было пропущено ... Это что-то вроде «стандарт не поддерживает + и - в то же время - он, безусловно, работает с glibc. –

+0

« - »флаг левосторонний. – BLUEPIXY

+0

Gah!Можете ли вы сказать, что прошло какое-то время, так как я использовал printf? –

0
int main() 
{ 
char s[100]; 
double x=-100.00; 

sprintf(s,"%s%f",x<0?"":"+",x); 
printf("\n%s",s); 
x = 1000.01; 
sprintf(s,"%s%f",x<0?"":"+",x); 
printf("\n%s",s); 
return 0; 
} 

Вот код. Его O/р ::

-100.000000 
+1000.010000 
+1

-1 для подачи ложки. –

+0

@AnishRam Почему отрицательный комментарий ... Он спросил это, поэтому я предоставил решение –

+0

Потому что ложное кормление не поможет OP. Почему бы вам просто не дать подсказки для решения? Очевидно, что ОП приложил очень мало усилий для решения этой проблемы. –

2

использование, как это

sprintf(outputstr, "%+7.2f", double_number); 

Э.Г.

#include <stdio.h> 
#include <string.h> 
#include <math.h> 

void output_string(char output_buffer[], double nums[], size_t size){ 
/* use '+' flag version 
    int i,len=0; 
    for(i=0;i<size;++i) 
     len += sprintf(output_buffer + len, "%+7.2f\n", nums[i]); 
*/ //handmade version 
    int i, len=0; 
    for(i=0;i<size;++i){ 
     char sign = nums[i] < 0 ? '-' : '+'; 
     char *signp; 
     double temp = abs(nums[i]); 

     len += sprintf(signp = output_buffer + len, "%7.2f\n", temp); 
     signp[strcspn(signp, "")-1] = sign;//The width including the sign is secured 
    } 
} 

int main(){ 
    double nums[] = { 
     +300.00, 
     -200.00, 
     +34.60, 
     +300.00, 
     +233.45, 
     -20.34 
    }; 
    char output_buffer[1024]; 
    int size = sizeof(nums)/sizeof(*nums); 

    output_string(output_buffer, nums, size); 
    printf("%s", output_buffer); 

    return 0; 
} 
+0

Вы видели пространство перед знаком? –

+0

@PeterMiehle Это оправдано без указания, когда ширина обеспечена достаточно большой. – BLUEPIXY

+0

note: Флаг '-' выравнивается по левому краю. – BLUEPIXY

0

вам нужен отдельный буфер, в котором вы Sprintf ваш номер с вашим знаком, и что результирующая строка вы можете Sprintf в rightjustified resultbuffer.