Sử dụng scanf()
có vấn đề. Nếu người dùng nhập -5 +10 -15 -15
vào dòng đầu vào đầu tiên, sau đó nhấn trả lại, bạn sẽ xử lý 4 số lần lượt với scanf()
. Đây có thể không phải là những gì bạn muốn. Ngoài ra, tất nhiên, nếu người dùng nhập +3 or more
, thì chuyển đổi đầu tiên sẽ dừng khi không gian được đọc và tất cả các chuyển đổi tiếp theo sẽ không thành công trên o
hoặc or
và mã sẽ đi vào vòng lặp. Bạn phải kiểm tra giá trị trả lại từ scanf()
để biết liệu nó có thể chuyển đổi bất kỳ thứ gì không.
Các vấn đề đọc trước đủ nghiêm trọng để tôi thay thế bằng cách sử dụng fgets()
để đọc dòng dữ liệu và sau đó sử dụng sscanf()
(thêm s
là quan trọng) để phân tích cú pháp số.
Để xác định xem một số dấu chấm động có một phần phân đoạn cũng như một phần số nguyên, bạn có thể sử dụng modf()
or modff()
chức năng - thứ hai kể từ adj
của bạn là một float
:
#include <math.h>
double modf(double x, double *iptr);
float modff(float value, float *iptr);
Giá trị trả về là phần phân đoạn đã ký của x
; giá trị trong iptr
là phần nguyên. Lưu ý rằng modff()
có thể không có sẵn trong trình biên dịch (thư viện thời gian chạy) không hỗ trợ C99. Trong trường hợp đó, bạn có thể phải sử dụng double
và modf()
. Tuy nhiên, có thể đơn giản để hạn chế người dùng nhập số nguyên với định dạng %d
và loại số nguyên cho adj
; đó là những gì tôi đã làm ngay từ đầu.
Một điểm chi tiết khác: bạn có thực sự muốn đếm số không hợp lệ trong tổng số lần thử không?
#include <stdio.h>
#include <math.h>
int main(void)
{
int counter=0;
int ttl=100;
printf("You all know the rules now lets begin!!!\n"
"\n\nWe start with 100. What is\n");
while (ttl != 5)
{
char buffer[4096];
float a_int;
float adj;
printf("YOUR ADJUSTMENT?");
if (fgets(buffer, sizeof(buffer), stdin) == 0)
break;
if (sscanf("%f", &adj) != 1)
break;
if (adj<=20 && adj>=-20 && modff(adj, &a_int) == 0.0)
{
counter++; // Not counting invalid numbers
ttl += adj;
printf("The total is %d\n", ttl);
}
else
{
printf ("I'm sorry. Do you not know the rules?\n");
}
}
if (ttl == 5)
printf("The game is won in %d steps!\n", counter);
else
printf("No-one wins; the total is not 5\n");
return(0);
}
Rõ ràng, tôi rất muốn bỏ qua khả năng ai đó có thể nhập hơn 4095 ký tự trước khi nhập trở lại.
Nguồn
2011-12-18 02:42:15
Ở cấp độ nhị phân, không có số dấu phẩy động nào có số thập phân. http://en.wikipedia.org/wiki/IEEE_754-2008 –
Chúng ta đang nói về phao nổi ở đây. Nó luôn luôn "có một số thập phân". Thay vào đó hãy sử dụng 'double'. (FYI @Chris và tôi có ý giống nhau) –
@TomvanderWoerdt: 'double' tạo nên sự khác biệt nào? –