9/5/15

Tại sao cần xóa bộ đệm bàn phím trước khi nhập chuỗi?

Thông thường, khi nhập một chuỗi trong màn hình console, ta phải có thao tác xóa bộ nhớ đệm bàn phím. Nếu không có thể thấy rằng kết quả nhập chuỗi bị sai hoặc trôi đi mất.

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, flushallfflush(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.

14 nhận xét:

  1. 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óa
  2. Nặc danh16:31 28/2/17

    fflush(stdin)

    Trả lờiXóa
    Trả lời
    1. fflush(stdin) khonong sử dụng cho vs mới nữa

      Xóa
    2. phải thêm thư viện #include vào nữa mới chạy được

      Xóa
  3. Tuy 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óa
  4. trườ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óa
    Trả lời
    1. Nế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é:
      #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é!!!

      Xóa
    2. sorry bạn, thư viện mình ghi thiếu rồi
      #include

      Xóa
    3. Nặc danh17:16 10/4/20

      vậy cách nào để cho nó in đúng vậy bạn

      Xóa
    4. Nặc danh17:18 10/4/20

      mì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óa
  5. Nặc danh20:51 13/10/18

    cho mình hỏi bộ nhớ đệm là gì ?????

    Trả lờiXóa
    Trả lời
    1. Nặc danh13:59 12/1/19

      bộ 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óa
  6. Nặc danh23:35 29/10/19

    cho 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