2011-08-29 7 views
5

Gdybym to zrobić:Jaka jest maksymalna liczba znaków wyprowadzanych przez sprintf przy wyprowadzaniu zmiennych i podwójnych zmiennych?

void printfloat(float number) 
{ 
    printf("%f", number); 
} 

i

void printdouble(double number) 
{ 
    printf("%f", number); 
} 

Jaka jest maksymalna liczba znaków, które mogą być wyprowadzane przez poszczególnych funkcji?

+0

zawsze można kontrolować tę kwotę: http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/FUNCTIONS/format.html#width – BlackBear

+1

ja nie wiem chcesz to kontrolować. Chcę wydrukować wszystko, co zwykle wydrukuje, i wiedzieć, jaka jest maksymalna. – Almo

+2

Część tego już została odebrana. Przynajmniej dla dwojaków: http: //stackoverflow.com/questions/1701055/what-is-the-maximum-length-in-chars-eded- to-represent-any-double-value –

Odpowiedz

2

Wniosek:

byłem w stanie dostać sprintf mi powiedzieć, jak duży napis byłby i chcę, aby zachować kod jak kompilator niezależny, jak to możliwe. Oto rozwiązanie, które wymyśliłem.

char numstr[50]; 
sprintf_s(numstr, "%g", *value); 
m_stringRepresentation += numstr; 

% g podaje liczbę w notacji naukowej, co poważnie ogranicza liczbę znaków. Wybrałem bufor wystarczająco duży, aby pomieścić wszystko, co może wyjść. Moja jedyna zależność od kompilatora dotyczy sprintf_s.

1

Szybki program testowy przepuszczony przez wc -c pokazuje 47 znaków dla float i 317 dla double. Program:

#include <stdio.h> 
#include <float.h> 

int main(void) { 
     printf("%f", -DBL_MAX); 
} 

Zauważ, że możesz użyć funkcji snprintf, aby ograniczyć wyjście do n znaków.

+0

Lub użyj 'snprintf (NULL, 0, ...);', aby dowiedzieć się, ile znaków będzie potrzebne dla bufora, abyś mógł przydzielić tyle. –

+0

Prawdopodobnie wykonam rozwiązanie Snprintf w tym komentarzu. Z mojego drugiego czytania na ten temat nie jestem w 100% przekonany, że 317 to maksimum.W większości jestem przekonany, ale nie na tyle, by opublikować wraz z nim kluczowy kod. :) – Almo

+0

snprintf nie jest zdefiniowany w naszym codebase. Próbowałem #include "stdio.h" bez powodzenia. – Almo

3

Via testów, przy użyciu MS Visual Studio 10, ciąg 811 wynikał z

sprintf(buf, "%.*f", 500, -DBL_MAX); 

pewnością dłuższe ciągi są możliwe przy większych wartościach precyzji.

Ale pozostając przy "% f", maksymalna liczba znaków wyjściowych wynosi 317 + 1 dla "\ 0".
Więc dla przenośnego kodu:

#include <float.h> 
#include <stdio.h> 

    char buf[1/*'-'*/ + (DBL_MAX_10_EXP+1)/*308+1 digits*/ + 1/*'.'*/ + 6/*Default? precision*/ + 1/*\0*/]; 
    sprintf(buf, "%f", -DBL_MAX); 

Funkcja printfloat (numer float) samotny parametr „numer”, jako pływaka i ograniczone do zakresu pływaka jest, przeprowadza się dwukrotnie w przejściu do sprintf(). Jego maksymalną wartością jest zatem FLT_MAX. Tak więc maksymalna liczba znaków wyjściowych wynosi 47 + 1 dla "\ 0".

char buf[1/*'-'*/ + (FLT_MAX_10_EXP+1)/*38+1 digits*/ + 1/*'.'*/ + 6/*Default? precision*/ + 1/*\0*/]; 
    sprintf(buf, "%f", -FLT_MAX); 
Powiązane problemy