01/10/2018, 00:36

Viết chương trình trò chơi One-two-three?

Cái này em tham khảo trên mạng rồi viết lại, chứ em k hiểu lắm, giờ nó chạy đc nhưng mà k ra kết quả gì, ai chỉ em với!

char i,k,kk,kkk;
	printf("Moi chon: ");
	scanf("%c",&i);
	switch(i)
	{
		case 1:
		       printf("Chon muc tuong ung: ");
		       scanf("%c",&k);
		       switch(k)
		       {
       			  case 'l':printf("thua
");break;//l:la;k:keo,d:dam
       			  case 'k':printf("Thang
");break;
       			  case 'd':printf("hoa
");break;
       			  default: printf("sai");
               }break;       
        case 2:printf("Chon muc tuong ung: ");
               scanf("%c",&kk);
               switch(kk)
               {
               	  case 'd':printf("thang
");break;
               	  case 'k':printf("thua
");break;
               	  case 'l':printf("hoa
");break;
               	  default: printf("sai");
     	       }break;       
     	case 3:printf("chon muc tuong ung: ");
		       scanf("%c",&kkk);
			   switch(kkk)
			   {
   				  case 'd':printf("thua
");break;
   				  case 'l':printf("Thang
");break;
   				  case 'k':printf("Hoa
");break;
   				  default:printf("sai");
   			   }break;
*grab popcorn* viết 02:50 ngày 01/10/2018

scanf("%c",&i);

scanf("%d", &i);
fflush(stdin) // clear buffer

Nếu bạn %c thì bạn đang đọc 1 ký tự. Vậy giả sử bạn nhập số 1. Nhưng với %c chương trình hiểu là bạn đang nhập ký tự 1. Và ký tự 1 có giá trị là 49 trong bảng mã ascii -> biến i bây giờ có giá trị là 49
-> Cái switch case kia nó thấy 49 ko khớp với 1, 2, 3 nên out ct luôn

Phan Vũ viết 02:42 ngày 01/10/2018

vậy bây giờ sửa lại thành case ‘l’, case ‘k’, case ‘d’ là đc hả bạn?

*grab popcorn* viết 02:39 ngày 01/10/2018

Đúng rồi
Còn ko bạn có thể sửa thành l, k, d là được.

Phan Vũ viết 02:46 ngày 01/10/2018

vẫn không đc bạn ơi, nó ra là: “moi ban chon: l
chon muc tuong ung: sai”

*grab popcorn* viết 02:39 ngày 01/10/2018

Bạn thêm fflush(stdin) sau khi nhập i là đc
Lý do là enter cũng là một ký tự.
Do bạn chỉ đọc 1 ký tự nên ký tự enter vẫn còn -> tới hàm đọc tiếp theo nó đọc cái ký tự này

Phan Vũ viết 02:41 ngày 01/10/2018

bạn có thể giải thích rõ hơn về cái [quote=“drgnz, post:6, topic:37502”]
fflush(stdin)
[/quote] được k? mình chưa hiểu cái này?

*grab popcorn* viết 02:46 ngày 01/10/2018

fflush(stdin) ở Window có chức năng đẩy hết các ký tự trong input buffer ra ngoài.
Vì khi bạn nhập cái gì, nó đều đẩy vô buffer rồi printf mới tới, đọc buffer rồi gán giá trị vào biến.
Khi đọc dữ liệu số thì thường sẽ ko có vấn đề gì vì printf thg sẽ tự động bỏ qua các ký tự ko nhìn thấy được (như enter, khoảng trắng, tab …)
Nhưng khi đọc ký tự hay chuỗi thì nó đọc sạch. Vậy nên nhiều khi nó sẽ đọc luôn mấy ký tự mình ko thấy được -> sai.

Vậy nên fflush(stdin) giúp dọn dẹp cái mớ đó đi và giúp bạn đọc input mới mà ko cần đọc qua cái mớ cũ nữa.

Lưu ý là chỉ trên Window thì nó mới có tác dụng thần kỳ như vậy.

Nguyễn Hoàng Trung viết 02:36 ngày 01/10/2018

Con tren Linux thi sao bac

*grab popcorn* viết 02:48 ngày 01/10/2018

Linux thì có hàm là __fpurge() or fpurge gì đấy thay thế

Nguyễn Hoàng Trung viết 02:52 ngày 01/10/2018

Ý em là nó có hoạt động theo kiểu đẩy vô buffer k í anh @@

*grab popcorn* viết 02:49 ngày 01/10/2018

Tất nhiên là có rồi

Cyberbob viết 02:40 ngày 01/10/2018

Trên linux bạn có thể dùng getc(stdin) thay cho fflush(stdin) hoặc viết 1 hàm riêng để là while(getchar()!=’/n’){};

Bài liên quan
0