Hàm fflush(stdin) dùng để làm gì?

#include <iostream>
using namespace std;
int main(int argc, char **argv){
	int soA, soB, tong;
binladen:cout << "nhap 2 so a, b de tinh tong" << endl;
	cin >> soA >> soB;
	tong = soA + soB;
	cout << "ket qua tong a+b = " << tong << endl;
	char c = getchar();
	cout << "neu mun tiep tuc nhan phim 't' + enter, thoat nhan phim bat ky" << endl;
	cin >> c;
	if (c == 't'|| c=='T')
	{
		goto binladen;
	}
	return 0;
}

@ltd a Đạt cái lệnh fflush(stdin) dùng để xoá ký tự đệm k mong muốn sao a?

2 Likes

Trong bài em đâu có fflush(stdin) đâu? Cái fflush(stdin) đúng là để xóa bộ đệm. Khi em nhập vào thì bao nhiêu ký tự cũng chui vào bộ đệm cho tới khi bộ đệm tràn.

Giả dụ em muốn nhập a b c vào. Nhưng em chỉ muốn lấy ab

#include <iostream>
#include <stdio.h>

int main()
{
    int a,b=0,c;
    std::cin >> a;
    fflush(stdin);
    std::cin >> c;
    std::cout << a << b << c;
    return 0;
}

Bây giờ anh nhập vào như sau

1 2<enter>
3

thì kết quả anh nhận được là

103

Lý do là fflush(stdin) đã bỏ đi số 2.

Vậy dùng fflush(stdin) làm gì?

Trong một số trường hợp, nhất là khi nhập chuỗi, thì stdin (tức là standard input nhận vào từ bàn phím) nhận thừa một số ký tự. Ví dụ dấu enter xuống hàng.

Ký tự enter nếu không được xử lý bằng fflush(stdin) thì sẽ ngay lập tực bị nhập vào chuỗi tiếp theo. Dẫn đến kết quả cho chuỗi tiếp theo bị lỗi. Thường là chuỗi thứ 2 sẽ chỉ chứa một dấu enter.

Em có thể bỏ fflush(stdin) ở ví dụ trên, và nhập lại tương tự như ví dụ trên sẽ thấy kết quả ngay.

13 Likes

ý anh là ví dụ e nhập :

1 2 enter

thì đặt fflush(stdin) ở dưới cin sẽ loại bỏ ký tự cuối đúng k a?

1 Like

hehee đúng cái em đang cần đây :smiley: :slight_smile: :blush:

2 Likes
#include <iostream>
using namespace std;
int main(int argc, char **argv){
	int n;
	nhaplain:cout << "nhap n" << endl;
	cin >> n;
	while (n<=0)
	{
		cout << "moi ban nhap lai n!";
		goto nhaplain;
	}
	return 0;
}

cái này nhập lại cũng đc :smile:

1 Like

Không phải em, stdin có vào thì cũng có ra. Vào là lúc mình nhập số vào, ra là lúc mình cin.

giả dụ như mình nhập vào 1 2<enter> nhưng mình chỉ cin một lần. thì khi đó stdin vẫn còn một số, là số 2.

Có lẽ anh sẽ kéo hết tất cả những bài này sang topic khác để thảo luận cho dễ.

2 Likes

ok e hiểu r! tại e chưa code trên máy! bt k xài ! tks a!

Thêm một ví dụ nữa nhé. Bài này mục tiêu là nhập chữ g thì yêu cầu nhập lại.

Code thì như thế này, nhưng khi nhập g tới lần thứ 2 thì không được nữa. Tại sao?

#include <stdio.h>

int main()
{
    char x;
nhaplai:
    printf("\n\n\t\t *A*");
    printf("\n\n\t\t *B*");
    printf("nhap gia tri ");
    scanf("%c", &x);
    if(x =='g')
    {
        goto nhaplai;
    }
    getchar();
}

a đạt chơi trò j đây>? :smiley: cái này là bắt nạt nhỏ à nha

1 Like

Haha, cái này là anh copy từ facebook, người ta viết sao anh viết thế thôi ^^

a đạt giải thích e 2 dòng print đó coi! ngao ngán quá! chứ code bỏ 2 dòng đó đi thì bt e vẫn làm

\n là xuống hàng
\t là tab
có nghĩa là xuống hàng xuống hàng tab tab đấy @Honey_moon

ý e là A vs B chứ này e bik r :frowning: ! đố ác nhé! chẳng lẽ bắt e lên google ông anh chơi kỳ! lớn rồi còn ham khoe khoang

1 Like

À, A với B thì là chữ bình thường thôi. Chắc người làm bài đó họ viết ví dụ thôi. hehehe

e trả lời theo suy đoán của e! a khai báo kiểu char! sau đó a tới địa chỉ với & vì thế nó đã xác định địa chỉ trên thanh ram rồi cho nên ko thể nhập lại 1 biến nữa vs cùng địa chỉ cấp phát

1 Like

Nó có liên quan đến fflush đó @Honey_moon, vì cái hàm scanf("%c", &x); bị dính enter. Nên chỉ nhập g được 1 lần, lần sau enter chui vào x, dẫn đến thoát chương trình.

Cách giải quyết là thêm fflush(stdin) vào sau scanf

#include <stdio.h>

int main()
{
    char x;
nhaplai:
    printf("\n\n\t\t *A*");
    printf("\n\n\t\t *B*");
    printf("nhap gia tri ");
    scanf("%c", &x);
    fflush(stdin);
    if(x =='g')
    {
        goto nhaplai;
    }
    getchar();
}

Tuy nhiên dây cũng không phải là cách tốt nhất. Cách tốt nhất là dùng getchar() để nhập 1 ký tự.

#include <stdio.h>

int main()
{
    char x;
nhaplai:
    printf("\n\n\t\t *A*");
    printf("\n\n\t\t *B*");
    printf("nhap gia tri ");
    x = getchar();
    if(x =='g')
    {
        goto nhaplai;
    }
    getchar();
}

Như thế này mình không cần fflush(stdin)

ý anh là dùng do while rồi getchar thôi! đk là !=g ; có clip a hướng dẫn nhập trong mảng ký tự rồi ! thế e cứ tưởng cao siêu lắm! làm nghĩ mún nát óc! hại não về đêm.

1 Like

Nếu đặt getchar() ở cuối thì chưa kịp thi hành đã bị goto nhập lại rồi. getchar() phải đặt ngay dưới x=getchar()

Anh Đạt cho em hỏi /t dùng làm gì ạ?
Hi vọng em lấy mấy topic cũ ra không làm phiền mọi người ạ! :slight_smile:

\t là ký tự tab ngang. Nó sẽ cách ra giống như là 1 khoảng trắng bự vậy đó. :wink:

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