Fprintf cùng 1 format nhưng với 2 code khác nhau lại ra kết quả khác nhau

Đề 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. :sweat_smile::sweat_smile::sweat_smile:
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);		
	}


Code 1

Không phải là format sai mà hàm này nó lấy luôn cả ký tự \n. Do đó trong client.tool chứa chuỗi Thien Long\n. Rồi đến lúc bạn print vào file thì nó cũng print luôn cả \n.

Bạn để ý thì thấy trước 32.45 có một khoảng trắng. Là do format là %d %s %lf thì nó sẽ thay lần lượt vào là 1 Thien Long\n 32.45 (đến đây chắc bạn hiểu rồi mình không nói nữa :sweat_smile:).

Code 2

scanf sẽ lấy từng argument được cách nhau bởi khoảng trắng. Lúc này client.tool có chứa chuỗi Thien.

Mà bạn đọc Code 1 rồi thì chắc cũng hiểu hết rôi nên mình cũng lại không phải nói thêm nữa. :laughing:

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