Trong quá trình chạy chương trình ta sẽ phải nhập bằng bàn phím, mọi ký tự bạn gõ vào bàn phím (kể cả ký tự Enter
\n
) đều được đẩy vào bộ nhớ đệm trước khi được gán vào biến. Nếu trước đó bạn có nhập số bằng scanf
hoặc cin
, chúng chỉ nhận số chứ không nhận được ký tự Enter, và ký tự Enter vẫn còn trong bộ nhớ đệm. Đến khi nhập chuỗi, các hàm nhập chuỗi nhận được ký tự Enter thì dừng nhập luôn và chương trình vẫn chạy tiếp. Điều này khiến kết quả bị sai.Bạn có thể sử dụng các hàm sau để thực hiện xóa bộ nhớ đệm.
flushall()
Hàm này được định nghĩa trong
stdio.h
. Nó có tác dụng xóa bộ nhớ đệm tất cả các dòng nhập, xuất chuẩn và nhập xuất file.fflush(stdin)
Hàm
fflush()
trong thư viện stdio.h
cũng có tác dụng tương tự flushall()
. Tuy nhiên nó cho phép lựa chọn xóa bộ nhớ đệm cho stream nào. Ở đây ta truyền vào stdin
để xóa bộ đệm cho dòng nhập chuẩn, tức là bàn phím.cin.ignore()
Đây là một phương thức của đối tượng
cin
trong C++. Phương thức này còn có những tham số khác nghĩa là bỏ qua hay loại bỏ một số lượng ký tự trong bộ đệm hoặc bỏ qua đến khi gặp ký tự nào đó. Nếu không có tham số thì mặc định là bỏ 1 ký tự trong bộ đệm. Dùng cách này hữu ích khi nhập dữ liệu chuyển từ số sang chữ.Vậy nên dùng hàm nào? Hàm nào cũng được,
flushall
và fflush(stdin)
có vẻ đơn giản hơn trong khi dùng cin.ignore()
bạn phải cẩn thận, không lạm dụng để tránh sai ý muốn.
e xài Visual Studio 2015. Xóa bộ nhớ đệm trong C e nên dùng hàm nào ạ.
Trả lờiXóafflush(stdin)
Trả lờiXóakhông đc
Xóafflush(stdin) khonong sử dụng cho vs mới nữa
Xóaphải thêm thư viện #include vào nữa mới chạy được
XóaTuy nhiên nó cho phép lựa chọn xóa bộ nhớ đệm cho stream nào. Bạn cho mình hỏi là trong C có những stream nào?Cái này mình chưa rõ lắm !
Trả lờiXóatrường hợp nào thì mình nên xóa bộ nhớ đệm, trường hợp nào thì không ạk
Trả lờiXóaNếu những gì còn xót lại trong bộ nhớ đệm không làm ảnh hưởng đến phần kết quả của các thành phần bên dưới chương trình thì bạn không cần phải xóa nhé!! Còn ngược lại, ví dụ nhé:
Xóa#include
using namespace std;
int main()
{
int a;
double b;
char ch;
cin>>ch>>a>>b;
cout<<"char : "<<ch<<endl;
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
return 0;
}
Bài này bạn nhập thử a1,25,1.25 xem nha. Do biến ch chỉ lấy 1 kí tự mà lúc nhập vào là 2 kí tự(a1) nên số 1 sẽ được lưu vào bộ nhớ đệm rồi gán tiếp cho biến a (a=1); tiếp theo số 25 lại được gán cho biến b (b=25); rồi dữ liệu cuối cùng (1.25) được nhập vào sẽ không được in ra nữa.
Nói chung bạn cân nhắc kiểu dữ liệu với đặc điểm của kiểu dữ liệu đó để cân nhắc xem có nên xóa bộ nhớ đệm không nhé!!!
sorry bạn, thư viện mình ghi thiếu rồi
Xóa#include
vậy cách nào để cho nó in đúng vậy bạn
Xóamình có thêm ignore vào sau chỗ cin>>ch thì sau khi xuất thì ch=a chớ ko phải ch=a1 @@
Xóacho mình hỏi bộ nhớ đệm là gì ?????
Trả lờiXóabộ nhớ đệm là bộ nhớ lưu trữ tạm thời, giống như là xài cin.ignore() trong c++ để tránh bị lỗi thêm enter và chuỗi nhập trong chương trình để khi chạy sẽ đưa ra kết quả chính xác
Xóacho mình hỏi tại sao nhập chuỗi kí tự nếu ko dùng cin.ignore(); thì bị nhảy dòng đầu tiên không cho nhập nhưng sao nhập chuỗi sô thì lại kong cần câu lệnh kia vẫn nhập bình thường ạ
Trả lờiXóa