tức là printf
được cho là bỏ qua 0 khi nó đứng trước dấu thập phân?Có thể printf() tạo ra "-.5" cho giá trị (-0.5) không?
Trả lời
Với tất cả những thứ được chỉ định trong ISO C99, điều này là không thể. Tài liệu cho các thông số chuyển đổi cho biết:
f, F: [...] Nếu ký tự dấu thập phân xuất hiện, ít nhất một chữ số xuất hiện trước nó. [...]
e, E: [...] có một chữ số (đó là khác không nếu đối số là khác không) trước khi nhân vật số thập phân điểm [...]
g, G : [...] được chuyển đổi sang phong cách
f
hoặce
[...]
Kể từ khi specifiers chuyển đổi khác sẽ không in một số dấu chấm động thập phân, điều này là không thể cả. Trừ khi bạn tìm thấy tiện ích mở rộng của nhà cung cấp giới thiệu một trình biến đổi chuyển đổi khác. Nhưng sau đó chương trình của bạn sẽ không được C hợp lệ nữa.
Cách giải quyết tốt nhất mà nói đến cái tâm của tôi là:
double number = 0.5;
char buf[80];
char *number = buf;
if (snprintf(buf, sizeof buf, "%f", number) <= 0)
goto cannot_happen;
while (*number == '0')
number++;
printf("%s\n", number);
Trong một từ: No ...
printf() không thể, nhưng chúng tôi có thể! –
Có 'printf' có thể. Xem câu trả lời của tôi. –
@R ..: Không thể. Xem bình luận của tôi cho câu trả lời của bạn. – DevSolar
Xem printf spec và phần chính xác. Bạn có thể làm printf("%+0.4f", -0.5);
xin lỗi đã không hoạt động – sharkin
Vâng? Downvote di chuột qua văn bản đọc: "Câu trả lời này không hữu ích". Điều này áp dụng vì câu trả lời của bạn không giải quyết được câu hỏi của OP. (Không * của tôi * downvote, nhưng vẫn - không có lý do để có được cá nhân.) – DevSolar
-1 cho là một jerk hoàn thành trong các bình luận; nó không được cho là hoàn toàn không phù hợp ở đây. –
Chắc chắn nó có thể, nhưng tôi sợ bạn sẽ không quá hài lòng với câu trả lời của tôi:
printf("-.5", -0.5);
Điều đó sẽ tạo ra một cảnh báo, vì không có thông số định dạng trong chuỗi "-.5" :). Tôi đánh giá cao một trò đùa, nhưng câu trả lời có thể là một Wiki cộng đồng. –
Alexander: đã đồng ý –
Yes. Sử dụng sự xác định định dạng
%g
thay vì
%f
, tức là
printf("%g", -0.5);
Nếu bạn không hài lòng với cách
%g
in một số con số trong ký hiệu hàm mũ, giải pháp thay thế là sử dụng
snprintf
để viết thư cho một bộ đệm chuỗi tạm thời, và sau đó đếm số của số không ở cuối trước khi viết nó ra với
printf("%.*s", num_nonzero_places, tmp);
, hoặc bạn chỉ có thể loại bỏ các số không và sử dụng
fputs
.
Bây giờ, tôi nhận ra câu hỏi là loại bỏ số 0 đứng đầu, không phải là số 0. Trong trường hợp này, cách tốt nhất tôi biết là sử dụng snprintf
để ghi vào một chuỗi tạm thời, sau đó bỏ qua ký tự đầu tiên khi viết nó ra nếu ký tự đó là '0'. Bạn cũng sẽ cần phải thay thế dấu '-' nếu giá trị là số âm. Một cách để làm điều này:
snprintf(tmp, sizeof tmp, "%+f", val);
printf("%.*s%s", tmp[0]=='-', tmp, tmp+1+(tmp[1]=='0'));
Sai. '% g' được chỉ định là'% f' hoặc '% e' tùy thuộc vào giá trị được in và cả hai giá trị được chỉ định để có chữ số ở phía trước dấu thập phân. Một thử nghiệm nhanh chóng xác nhận điều này: 'printf ("% g ", -0.5);' yields "-0.5" trên máy tính của tôi (Linux). – DevSolar
Tệ của tôi. Tôi đã đọc nó như là một yêu cầu để loại bỏ các số không theo sau, không phải là số 0 đứng đầu. –
Các chỉnh sửa mới phải cung cấp một cách tiếp cận đơn giản và chính xác. –
Chuyển đổi đôi hoặc nổi lên một char thì:
while (*yourChar != '\0') {
if (yourDoubleBeforeConversion > 1.0 && yourDoubleBeforeConversion < -1.0) {
continue;
}
if(*yourChar == '.') {
yourChar--;
*yourChar = '';
}
else {
}
}
explination:
- trong khi vòng lặp xác định khi nào char kết thúc.
- Nếu gấp đôi bạn có lớn hơn 1 thì không có điểm nào trong trang trí.
- Nếu không tiếp tục kiểm tra ".".
- Khi tìm thấy trước, hãy xóa số 0.
- 1. định dạng chuỗi cho giá trị dấu phẩy động printf
- 2. MySQL: có thể một AUTO_INCREMENT tạo ra các giá trị không theo thứ tự?
- 3. Tại sao printf (char []) tạo ra một cảnh báo, trong khi đó printf ("asdf") không
- 4. Turbo C++: Tại sao printf in giá trị dự kiến, khi không có biến nào được truyền cho nó?
- 5. Căn chỉnh đầu ra printf trong Java
- 6. Tại sao printf trả về một giá trị?
- 7. Tôi có thể tạo một giá trị cho một thẻ bị thiếu trong XPath không?
- 8. Oracle giá trị Chuỗi không ra lệnh
- 9. Giá trị trong Từ điển Python có thể có hai giá trị không?
- 10. Tạo một loại giá trị không thể vô hiệu hóa có thể vô hiệu hóa
- 11. Velocity có thể đặt giá trị mặc định cho một biến khi không tìm thấy giá trị trong VelocityContext không?
- 12. C loại bỏ đầu ra printf
- 13. truy cập giá trị checkbox động tạo ra trong C#
- 14. Có thể bỏ qua các tham số có giá trị mặc định trong cuộc gọi hàm php (5) không?
- 15. Entity Framework 5 DbUpdateException: giá trị Null cho không nullable viên
- 16. write() để stdout và printf đầu ra không xen kẽ?
- 17. Hàm tạo chuỗi có giá trị rỗng
- 18. Khởi tạo giá trị Scala
- 19. printf flush tại lối ra chương trình
- 20. Có thể tạo danh sách từ các giá trị có thể có của datatype trong Haskell không?
- 21. Hadoop: Cách dễ dàng để có đối tượng là giá trị đầu ra không có giao diện có thể ghi
- 22. Chỉ mục trên một cột chỉ có 5 giá trị khác biệt - Đáng giá?
- 23. vị trí CALayer chứa NaN: [nan -0.5]
- 24. Cú pháp cho INSERTing vào bảng không có giá trị?
- 25. Khuôn khổ thực thể: Không thể tạo giá trị không đổi của loại 'System.Collections.Generic.IList`1'
- 26. Bạn luôn có thể khởi tạo giá trị một cách rõ ràng nếu bạn chỉ đặt giá trị đó thành giá trị mặc định của nó không?
- 27. Giá trị phiên có thể bị tấn công không?
- 28. Trong mục tiêu c, có thể đặt giá trị mặc định cho biến lớp không?
- 29. printf cho size_t
- 30. Có thể tạo ra xem cho chèn truy vấn
Trong ngôn ngữ gì? – halfdan
@halfdan bạn có biết về -any- trong đó có thể không? :) – Habbie
@halfdan, tôi nghĩ rằng hầu hết các ngôn ngữ thực hiện printf chỉ cần chuyển nó vào libc ..? – Amadan