Giải thích giúp lệnh fflush(stdin) trong chương trình

//viet chuong trinh tro choi Keo-Bua-Giay//
#include <stdio.h>
void nhap( char &i,char &j);
int xet( char i, char j);
void xuat( int o);
void main()
{
	char i,j;
	nhap(i,j);
	int o=xet(i,j);
	xuat(o);
}
void nhap( char &i, char &j)
{
	printf(" moi ban chon.\n");
	scanf("%c",&i);
        (fflush(stdin))  //mình thêm ở đây//
	printf(" moi ban chon.\n");
	scanf("%c",&j);
}
int xet(char i, char j)
{
	switch(i)
	{
		case 'B':
			{
			switch(j)
			{
				case 'K': return 0;
					break;
				case 'G': return 1;
					break;
				case 'B': return 6;
					break;
			}
			break;
			}
		case 'K':
			{
			switch(j)
			{
				case 'G':return 2;
					break;
				case 'B':return 3;
					break;
				case 'K':return 6;
					break;
			}
			break;
			}
		case 'G':
			{
			switch(j)
			{
				case 'B':return 4;
					break;
				case 'K':return 5;
					break;
				case 'G':return 6;
					break;
			}
			break;
			}
		default: return 7;
	}
return -1;
}
void xuat( int o)
{
	switch(o)
	{
		case 0: printf (" ban 1 thang");break;
		case 1: printf (" ban 2 thang");break;
		case 2: printf(" ban 1 thang");break;
		case 3:	printf (" ban 2 thang");break;
		case 4:	printf (" ban 1 thang");break;
		case 5:	printf (" ban 2 thang");break;
		case 6:	printf(" 2 ban hoa");break;
		case 7: printf(" ban chon sai");break;
	}
}

nếu mình không thêm lệnh fflush tại chỗ đó thì chương trình mình chạy ra ra như vậy nè:

moi ban chon.
K ( mình nhập kí tự K vào)
moi ban chon.
Press any key to continue
(không thể nhập kí tự cho dòng mời bạn chọn thứ 2 mà ấn vào phím nào là nó out lun)

có lệnh fflush thì không bị như vậy. Mấy bạn giải thích dùm mình với

Không biết bạn đã thử search trên DNH chưa:

https://daynhauhoc.com/search?q=fflush(stdin)

mình cũng đọc qua rồi nhưng vẫn chưa hiểu lắm.

Bạn đọc topic này:

https://daynhauhoc.com/t/thac-mac-ve-cin-string-trong-c/49763

Topic này nói về fflush(stdin). Tóm lại, fflush(stdin) là vô dụng.

nhưng trong trường hợp bài của mình phải có fflush(stdin) chương trình mới chạy đúng, cho mình hỏi tại sao vậy

Khi bạn nhập vào 1 kí tự, bạn phải nhấn Enter. Trong bộ nhớ đệm (buffer) có kí tự bạn nhập vào và kí tự \n sinh ra do bạn nhấn Enter. Kí tự \n bị “lôi” sang phần đọc char ở sau, nên bạn không thể nhập tiếp kí tự vào.

cái fflush(stdin) đã xóa hết mọi kí tự trong bộ nhớ đệm bao gồm kí tự K mình vừa nhập hay chỉ xóa đi kí tự \n thôi

fflush(stdin) xoá đi những kí tự thừa ở trong buffer. Trong trường hợp này, nó sẽ xoá \n.

thanks bạn nhiều mình đã hiểu rồi. À cho mình hỏi thêm một điều ngoài lề nữa là lệnh return trong c có thể trả về một chuỗi kí tự cho hàm không. Nếu được thì mình khai báo kiểu dữ liệu trả về của hàm là gì vậy

char*, nhưng nên hạn chế trả về chuỗi kiểu này, coi vậy chứ không dễ đâu :slight_smile:

1 Like

sao vậy bạn. Ví dụ như mình có chương trình nhập 3 số và xét xem 3 số đó có tạo thành loại tam giác j

#include<stdio.h>
void nhap( float &a, float &b, float &c);
int xet( float a, float b, float c);
void xuat( int kt);
void main()
{
	float a,b,c;
	int kt;
	nhap( a,b,c);
	kt= xet(a,b,c);
	xuat( kt);
}
void nhap(float &a, float &b, float &c)
{ scanf("%f%f%f", &a,&b,&c);
}
int xet( float a, float b, float c)
{
	if((a==b)&&(a==c))
		return(0);
	else if((a==b)||(a==c)||(b==c))
		if ((c*c==b*b+a*a)||(a*a==b*b+c*c)||(b*b==a*a+c*c))
			return(1);
		else 
			return(2);
	else if((c*c==b*b+a*a)||(a*a==b*b+c*c)||(b*b==a*a+c*c))
		return(3);
	else 
		return(4);
}
void xuat( int kt)
{
	if(kt==0)
		printf("la tam giac deu");
	if(kt==1)
		printf("tam giac vuong can");
	if(kt==2)
		printf("tam giac can");
	if(kt==3)
		printf(" tam giac vuong");
	if(kt==4)
		printf(" tam giac thuong");
}

nếu cứ return 0 rồi 1 rồi 2 như vậy rất khó nhớ mình return số mấy cho trường hợp nào nên mình định trả về một xâu kí tự dễ nhớ như khi là 3 số lập thành tam giác đều thì return (deu); chẳng hạn. Như vậy có thực hiện được không

Vậy thì dùng enum.

1 Like

Dùng như thế nào vậy bạn và enum là gì

Một khi bạn đã code C++ trên máy tính, vứt stdio.h, scanf, printf… đi
Toàn những thứ phức tạp dễ lỗi.

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