01/10/2018, 11:11

Lỗi trôi lệnh trong C

int EnterNumber(){
	int number;
	printf("Enter your's number:");
	if(!scanf("%d", &number)){
		puts("Keypress don't number!");	
		int choose = 0;
		puts("Work:
	1. Continue 2. Break 
Your's number will choose:");					
		while(!scanf("%d", &choose)){	
			switch(choose){
				case 1: 
					EnterNumber();
					break;
				case 2:
					break;
			default:
				puts("Keyboard don't recognize");
				break;
			}
		}
	}
	
	return number;
}  

đây là code của em! ý tưởng: khi nhập number là 1 kí tự khác số thì chuyển vào vòng lặp yêu cầu người dùng chọn cách sử lý! nhưng nó trôi không cho nhập biến choose!

Trần Hoàn viết 13:11 ngày 01/10/2018

Ngay trước khi vào vòng while nhớ xoá bộ nhớ đệm.

Henry viết 13:26 ngày 01/10/2018

Khi bạn sử dụng scanf để nhận input nhưng lại nhập chữ hay gì đó ngoài số trong khi bạn yêu cầu input đợi một số thì nó bị ngu người, điều này khiến cho việc cái input tiếp tục làm việc là không được. Bạn phải tát cho nó tỉnh bằng nhiều cách khác nhau. Xóa bộ đệm như bạn @noz1995 đã gợi ý thử xem.

nghia viết 13:15 ngày 01/10/2018

Khi bạn sử dụng scanf để nhận input nhưng lại nhập chữ hay gì đó ngoài số trong khi bạn yêu cầu input đợi một số thì nó bị ngu người, điều này khiến cho việc cái input tiếp tục làm việc là không được. Bạn phải tát cho nó tỉnh bằng nhiều cách khác nhau. Xóa bộ đệm như bạn @noz1995 đã gợi ý thử xem.

mình dùng fflush(stdin) rồi mà nó vẫn fail chạy tiếp luôn không cho mình nhập!

Henry viết 13:14 ngày 01/10/2018

Thử cái ni

while ((c = getchar()) != EOF && c != '\n');
nghia viết 13:17 ngày 01/10/2018

cái này là kiểm tra không nhập gì mà bạn!

Henry viết 13:24 ngày 01/10/2018

Cái này là clear buffer đấy bạn

nghia viết 13:16 ngày 01/10/2018

ok bạn! đề mình làm thử!

nghia viết 13:15 ngày 01/10/2018

Nó vẫn trôi tiếp bạn!

Henry viết 13:26 ngày 01/10/2018

Thử với

while ((c = getchar()) != '\n' || c != EOF);
nghia viết 13:15 ngày 01/10/2018

ok bạn mình làm được rồi! thêm 1 vòng lặp ở ngoài nữa là ok while(’\n’ != getchar()){ code error when enter number}

Khoa NTA viết 13:26 ngày 01/10/2018

Hơi trễ nhưng mình muốn bổ sung thêm (mới tìm được ở stackoverflow và dịch ra luôn).
Trong trường hợp mình đang muốn nhập số và dùng scanf, sau khi nhập 1 chuỗi vào (ví dụ "hello") và ký tự đầu tiên gặp được ('h') không phải số thì scanf gặp lỗi và để hết dữ liệu lại trong input nên trong lần gọi scanf sau nó lại tiếp tục gặp cái đống dữ liệu trước ("hello") rồi tiếp tục fail,… Đó là lý do vì sao cần phải clear-buffer.

Nhưng có cách giải quyết khác là bạn đọc 1 dòng (fgets) và dùng int sscanf( const char *buffer, const char *format, ... ); để phân tích dòng đó :v trả về 1: thành công, 0: thất bại.

nghia viết 13:14 ngày 01/10/2018

em làm đc rồi anh! Cảm ơn anh nhiều! Em cần rèn thêm tiếng anh để search tốt hơn!

Bài liên quan
0