Tại Sao Cần Xóa Bộ đệm Bàn Phím Trước Khi Nhập Chuỗi?

TRANG

  • home
  • lập trình
  • tản mạn
  • about

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

14 nhận xét:

  1. Unknown19:29 15/11/16

    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óaTrả lời
      Trả lời
  2. Nặc danh16:31 28/2/17

    fflush(stdin)

    Trả lờiXóaTrả lời
    1. tay19:35 17/5/19

      không đc

      XóaTrả lời
        Trả lời
    2. Unknown16:35 27/10/19

      fflush(stdin) khonong sử dụng cho vs mới nữa

      XóaTrả lời
        Trả lời
    3. Ngọc Danh14:03 7/3/20

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

      XóaTrả lời
        Trả lời
    4. Trả lời
  3. Để gió cuốn đi19:58 16/3/17

    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óaTrả lời
      Trả lời
  4. Unknown12:11 5/4/17

    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óaTrả lời
    1. Unknown23:07 30/7/19

      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é: #includeusing 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óaTrả lời
        Trả lời
    2. Unknown23:10 30/7/19

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

      XóaTrả lời
        Trả lời
    3. Nặc danh17:16 10/4/20

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

      XóaTrả lời
        Trả lời
    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óaTrả lời
        Trả lời
    5. Trả lời
  5. Nặc danh20:51 13/10/18

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

    Trả lờiXóaTrả 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óaTrả lời
        Trả lời
    2. Trả lời
  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óaTrả lời
      Trả lời
Thêm nhận xétTải thêm... Bài đăng Mới hơn Bài đăng Cũ hơn Trang chủ Đăng ký: Đăng Nhận xét (Atom)

NỔI BẬT

[Visual Studio] Những mẹo sử dụng Visual Studio một cách hiệu quả

Visual Studio là một IDE rất mạnh mẽ của Microsoft, nó hỗ trợ rất nhiều tính năng từ cơ bản đến nâng cao. Nếu là lần đầu dùng Visual Studio ...

PHỔ BIẾN

  • Cài đặt và sử dụng bộ gõ tiếng Nhật trên Windows 10
  • Một số quy định viết code trong lập trình C#
  • Hướng dẫn làm menu đơn giản trong màn hình Console
  • Các hàm xử lý chuỗi trong C
  • Cài đặt và thiết lập Java trên Windows
  • Từ vựng về lập trình tiếng Nhật
  • [Visual Studio] Những mẹo sử dụng Visual Studio một cách hiệu quả
  • Cách vẽ lại cây nhị phân tìm kiếm từ kết quả duyệt
  • Làm quen với MessageBox trong C#
  • Một số thao tác cơ bản với cấu trúc Phân số

TAGS

C/Cpp kiến thức bài tập thủ thuật cấp phát động cấu trúc giải thuật mảng một chiều tiếng Nhật mảng hai chiều chuỗi con trỏ danh sách liên kết hướng đối tượng sắp xếp C# Pascal lập trình ma trận thao tác file Git Java Ruby Ruby on Rails cây nhị phân cây nhị phân tìm kiếm lập trình Windows Form

THEO DÕI TRÊN FACEBOOK

BÀI VIẾT

  • ▼  2015 (45)
    • ▼  tháng 5 (3)
      • Tại sao cần xóa bộ đệm bàn phím trước khi nhập chuỗi?
      • Cách viết một hàm đọc file cơ bản trong C/C++
      • Vấn đề cấp phát động trong hàm

Từ khóa » Bộ Nhớ đệm Stdin