Đề bài là: in kết quả vào 1 file test với format account name balance.
Mình muốn nhập name là một chuỗi có cả space ví dụ như John Wick (có thể có khách chỉ có 1 tên) chứ không phải dạng nhập dưới dạng format lastname firstname.
Kinh nghiệm thấy mấy hàm liên quan đến nhập string từ stdin đều có cái lỗi chung là nếu trước nó có hàm nhập input như scan thì kiểu gì thì cũng sẽ tự động lấy luôn các ký tự sau đó luôn. Ví dụ scan %d, &a, type từ bàn phím 200 thì sẽ lấy luôn enter hoặc ký tự gì đó ngay sau số 200 này.
Do vậy mình mới để scan rồi fgets cùng nhau 200John Wick thì fprint được luôn 200 John Wick.
struct clientData
{
unsigned int account;
char tool[25];
double balance;
};
int main(void)
{
struct clientData client = { 0, "", 0.0 };
FILE *cfPtr;
if ((cfPtr = fopen("test.txt", "w")) == NULL)
{
puts("Cant open file.");
}
else
{
puts("Please enter your data from 1 to 100:");
scanf("%d", &client.account);
fgets(client.tool, 10, stdin);
}
while (client.account != 0)
{
puts("Please enter balance: ");
scanf("%lf", &client.balance);
fprintf(cfPtr, "%d %s %.2f\n", client.account, client.tool, client.balance);
scanf("%d", &client.account);
fgets(client.tool, 10, stdin);
}
Như ảnh thấy giá trị balance tự động xuống dòng không như format. Tuy nhiên nếu sửa code nhập như dưới đây lại đúng format mong muốn. 


Có cao nhân nào hiểu cơ chế hoạt động khác nhau của nó không?
else
{
puts("Please enter your data from 1 to 100:");
scanf("%d", &client.account);
}
while (client.account != 0)
{
puts("Please enter balance: ");
scanf("%24s%lf", client.tool, &client.balance);
fprintf(cfPtr, "%d %s %.2f\n", client.account, client.tool, client.balance);
scanf("%d", &client.account);
}




).
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?