30/09/2018, 16:10

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?

Nguyễn Minh Dũng viết 18:16 ngày 30/09/2018

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.

Thực tế khắc nghiệt viết 18:11 ngày 30/09/2018

ý 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?

Onethingisforever! viết 18:24 ngày 30/09/2018

hehee đúng cái em đang cần đây

Thực tế khắc nghiệt viết 18:18 ngày 30/09/2018
#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

Nguyễn Minh Dũng viết 18:24 ngày 30/09/2018

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ễ.

Thực tế khắc nghiệt viết 18:11 ngày 30/09/2018

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

Nguyễn Minh Dũng viết 18:13 ngày 30/09/2018

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();
}
Thực tế khắc nghiệt viết 18:22 ngày 30/09/2018

printf("\n\n\t\t A");
printf("\n\n\t\t B");

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

Nguyễn Minh Dũng viết 18:15 ngày 30/09/2018

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

Thực tế khắc nghiệt viết 18:26 ngày 30/09/2018

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

Nguyễn Minh Dũng viết 18:26 ngày 30/09/2018

\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

Thực tế khắc nghiệt viết 18:15 ngày 30/09/2018

ý e là A vs B chứ này e bik r ! đố á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

Nguyễn Minh Dũng viết 18:19 ngày 30/09/2018

À, 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

Thực tế khắc nghiệt viết 18:26 ngày 30/09/2018

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

Nguyễn Minh Dũng viết 18:22 ngày 30/09/2018

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)

Thực tế khắc nghiệt viết 18:19 ngày 30/09/2018

ý 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.

Xuân Tùng Nguyễn viết 18:13 ngày 30/09/2018

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()

Phúc viết 18:23 ngày 30/09/2018

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 ạ!

Nguyễn Tấn Khoa viết 18:11 ngày 30/09/2018

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

Phúc viết 18:21 ngày 30/09/2018

Vâng em cảm ơn anh ạ, tạm em đang bắt đầu học C++ do có việc bận nên chưa có thời gian ạ

Bài liên quan
0