30/09/2018, 18:17

xoá bộ đệm bằng if(fgets(string, size, stdin) != NULL);

#include <stdio.h>
#include <string.h>
int main()
{
    int age;
    char name [256];
    printf ("Insert your age: ");
    scanf("%d",&age);
    if (fgets (name,256,stdin) != NULL); //xoa bo dem
    printf ("Insert your name: ");
	fgets (name,256,stdin); 
    name[strlen(name)-1] = '';
    printf ("Your name is: %s and you are %d years oldn",name, age);
    return 0;
}

Nếu không có if(fgets (name,256,stdin) != NULL); thì name sẽ nhận và gây ra kết quả không mong muốn.
Nhưng em không hiểu dòng lệnh trên hoạt động ra sao và tại sao lại như vậy, mong mọi người giải thích

Gió viết 20:21 ngày 30/09/2018

Thực ra xóa câu lệnh '\n' ở đó không cần if

khi đọc xong số VD: 123’\n’
thì sau khi đọc scanf vị trị đọc dữ liệu đang dừng ở trước ’\n' khi bạn ấn [enter] và fgets (trong if) sẽ đọc sang dòng mới. Sau đó fgets sau sẽ đọc đúng

明玉 viết 20:33 ngày 30/09/2018

Trên http://www.cplusplus.com/reference/cstdio/fgets/ có đoạn:

A newline character makes fgets stop reading, but it is considered a valid character by the function and included in the string copied to str.

Như vậy fgets sẽ đọc stdin đến end-of-file hoặc đọc đủ số ký tự thì dừng lại, riêng đến \n thì dừng lại nhưng có đọc luôn cả \n vào name, thế là stdin đã qua \n và không sợ bị lỗi nữa.

Bài liên quan
0