5

Tôi có câu hỏi về việc sử dụng printf.định dạng chuỗi cho giá trị dấu phẩy động printf

char str[8]; 
float val = 2.334563; 
sprintf(str, format, val); 
printf("val = %s.\n", str); 

val = -23.34563; 
sprintf(str, format, val); 
printf("val = %s.\n", str); 

val = -0.02334563; 
sprintf(str, format, val); 
printf("val = %s.\n", str); 

val = 233; 
sprintf(str, format, val); 
printf("val = %s.\n", str); 

Sản lượng dự kiến ​​sau:

val = +2.3345 
val = -23.345 
val = -0.0233 
val = +233.00 

Tôi cần chuỗi định dạng gì cho điều đó? Cám ơn vì sự quan tâm của bạn.

Trả lời

3

những gì đã xảy ra với tốt cũ %f

+0

Không nhận được mong muốn đầu ra. Câu hỏi của ông nên được hỏi trực tiếp hơn. –

+0

@JoeMcGrath: Điều này có mùi Q rõ ràng về Bài tập về nhà và tôi không đánh giá cao việc viết bất kỳ hình thức mã nào cho Câu hỏi Bài tập về nhà ngoài việc đưa ra gợi ý hoặc ý tưởng. ** Lý do: ** Tôi không muốn một lập trình viên ngồi ngay bên cạnh tôi (Mặc dù một vài năm kể từ bây giờ) những người không thể viết một mã nguồn đưa ra một gợi ý. –

+0

Ok cảm ơn. Tôi mới vào Stack Overflow và không nhận ra. Chỉ cố gắng trả lời câu hỏi. Tôi là một lập trình viên hobbyist chưa từng đến trường. Không nghĩ đến bài tập về nhà. Sẽ nhớ làm điều này trong tương lai. –

0
"%f" 

dụ

printf("%f\n", floatVal); 
+0

Tôi cần chuỗi đầu ra kích thước cố định. – user1020803

+0

cũng như ''% f "' hiển thị dấu + ở phía trước số dương. –

+0

"% + f" sẽ hiển thị dấu hiệu ... Nhưng đây không phải là toàn bộ vấn đề ... – user1020803

1

sử dụng snprintf() để cắt chuỗi vào đúng 8 ký tự bao gồm \0

Format chuỗi:

"%#+.5f" 

% modifier 
# force decimal place 
+ show + or - 
.5 precision of 5 
f use precision as places after decimal 

Code:

char str[8]; 
float val = 2.334563; 
snprintf(str,8, "%#+.5f", val); 
printf("val = %s\n", str); 

val = -23.34563; 
snprintf(str,8, "%#+.5f", val); 
printf("val = %s\n", str); 

val = -0.02334563; 
snprintf(str,8, "%#+.5f", val); 
printf("val = %s\n", str); 

val = 233.001; 
snprintf(str,8, "%#+.5f", val); 
printf("val = %s\n", str); 

Output:

val = +2.3345 
val = -23.345 
val = -0.0233 
val = +233.00 
val = +0.0003 
+0

Tôi nghĩ rằng snprintf (str, 8, "% # +. 5f", 0.0003); tốt nhất của tất cả các – user1020803

+0

@ user1020803 Điều đó làm việc trong mọi trường hợp. Đã mất trong tất cả các thay đổi của tôi không chắc chắn lý do tại sao tôi vẫn còn sử dụng sung sung sau khi tôi chuyển sang snprintf(). Cảm ơn. chỉnh sửa để phản ánh. –

0

Điều duy nhất mà tôi có thể đưa ra như sau:

const char *format = "val = %+6.*f\n"; 
int places_past_decimal = ???; 
printf(format, places_past_decimal, 2.334563f); 

Trong trường hợp này, bạn sẽ cần phải vượt qua đối số bổ sung (places_past_decimal) là số chữ số còn lại trong số không được sử dụng ở bên trái số .

+0

Tôi nghĩ về nó, nhưng hy vọng cho giải pháp tốt nhất. – user1020803

1

Phần sau (gần như) thực hiện những gì bạn muốn. Lưu ý rằng tôi đã thay đổi số ký tự trong mảng str từ 7 đến 8; vì tất cả các chuỗi đầu ra của bạn chứa 7 ký tự, kết thúc NULL được thực hiện bởi sprintf sẽ gây tràn bộ đệm nếu không.

Sự khác biệt duy nhất giữa kết quả của tôi và của bạn là làm tròn được thực hiện bởi sprintf. AFAIK, cách duy nhất để giải quyết vấn đề này là cắt trước số bạn muốn in bằng cách sử dụng floor; ví dụ, để in 2 chữ số mà không làm tròn float f = floor(1.8888 * 100)/100;

#include <stdio.h> 

int main(void) 
{ 
    char str[8]; 

    { 
    float val = 2.334563f; 
    sprintf(str, "%+6.*f", 4, val); 
    printf("val = %s.\n", str); 
    } 

    { 
    float val = -23.34563f; 
    sprintf(str, "%+6.*f", 3, val); 
    printf("val = %s.\n", str); 
    } 

    { 
    float val = -0.02334563f; 
    sprintf(str, "%+6.*f", 4, val); 
    printf("val = %s.\n", str); 
    } 

    { 
    float val = 233.0f; 
    sprintf(str, "%+6.*f", 2, val); 
    printf("val = %s.\n", str); 
    } 

    return 0; 
} 

Output:

val = +2.3346. 
val = -23.346. 
val = -0.0233. 
val = +233.00. 
+0

Có, tôi đã quên về NULL – user1020803

+0

Điều này yêu cầu tính số lượng thập phân cần thiết theo cách thủ công trong mã. cách để làm điều này với mã cho bất kỳ trường hợp là gì? –

Các vấn đề liên quan