2011-08-29 19 views
5

Nếu tôi làm điều này:Số ký tự tối đa được tạo ra bởi sprintf khi xuất ra các biến số float và double là gì?

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

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

số ký tự tối đa có thể được xuất ra bởi mỗi chức năng là gì?

+0

Bạn luôn có thể kiểm soát số tiền mà: http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/FUNCTIONS/format.html#width – BlackBear

+1

tôi không muốn kiểm soát nó. Tôi muốn in tất cả mọi thứ nó thường in, và biết tối đa là gì cho điều đó. – Almo

+2

Một phần của điều này đã được trả lời. Ít nhất là để tăng gấp đôi: http: //stackoverflow.com/questions/1701055/what-is-the-maximum-length-in-chars-needed-to-represent-any-double-value –

Trả lời

2

Kết luận:

tôi đã không thể có được snprintf cho tôi biết làm thế nào lớn chuỗi sẽ là, và tôi muốn giữ lại các mã như trình biên dịch độc lập càng tốt. Vì vậy, đây là giải pháp tôi đã đưa ra.

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

% g xuất ra số theo ký hiệu khoa học, giới hạn số lượng ký tự. Tôi đã chọn một bộ đệm đủ lớn để chứa bất cứ thứ gì có thể xuất ra. Trình biên dịch phụ thuộc duy nhất của tôi là trên sprintf_s.

1

Chương trình thử nghiệm nhanh được truyền qua wc -c cho thấy 47 ký tự cho phao và 317 để tăng gấp đôi. Chương trình:

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

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

Lưu ý rằng bạn có thể sử dụng dấu vân tay để giới hạn đầu ra thành ký tự.

+0

Hoặc sử dụng 'snprintf (NULL, 0, ...);' để tìm ra số lượng ký tự cần thiết cho bộ đệm để bạn có thể phân bổ nhiều ký tự đó. –

+0

Tôi có lẽ sẽ làm giải pháp snprintf trong bình luận này. Từ đọc khác của tôi về chủ đề này, tôi không phải là 100% thuyết phục 317 là tối đa.Tôi chủ yếu bị thuyết phục, nhưng không đủ để xuất bản mã nhiệm vụ quan trọng với nó. :) – Almo

+0

snprintf không được định nghĩa trong codebase của chúng tôi. Tôi đã thử #include "stdio.h" không may mắn. – Almo

3

Qua thử nghiệm, sử dụng MS Visual Studio 10, một chuỗi của 811 kết quả từ

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

Chắc chắn dây còn có thể xảy ra với các giá trị chính xác lớn hơn.

Nhưng ở lại với "% f", số lượng ký tự tối đa là 317 + 1 cho '\ 0'.
Vì vậy, đối mã di động:

#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); 

Chức năng printfloat (số float) duy nhất tham số "number", là một phao và giới hạn trong phạm vi của một float, được chuyển thành một đôi trong đi qua để sprintf(). Do đó, giá trị tối đa là FLT_MAX. Vì vậy, số lượng tối đa các ký tự đầu ra là 47 + 1 cho '\ 0'.

char buf[1/*'-'*/ + (FLT_MAX_10_EXP+1)/*38+1 digits*/ + 1/*'.'*/ + 6/*Default? precision*/ + 1/*\0*/]; 
    sprintf(buf, "%f", -FLT_MAX); 
Các vấn đề liên quan