01/10/2018, 00:32

Sự khác nhau giữa get và getline. Cách hoạt động của 2 hàm đó


Xin hỏi a/c là như 2 hình trên tại sao get lại lây sang biến khác , e đã đảo ngược getline lên trước thì lại không bị . Và cách hoạt động của 2 hàm đó ?

Nguyễn Xuân Phúc viết 02:46 ngày 01/10/2018

không có chuyện đó nhé, chưa đủ mà gặp enter nó vẫn ngưng nhé

  • get: khi gặp kí tự phân tách (delimiter), thì nó ngừng, và đưa delimiter này vào buffer chờ đọc tiếp (đó là lý do vì sao ở hình đầu, chắn chắn lệnh getline sẽ bị trôi, vì ghi getline nó ưu tiên trong buffer trước và buffer đang có dữ liệu nên nó sẽ đọc thằng '\n' vào).
  • getline: khi gặp delimiter, nó sẽ ngừng, đồng thời bỏ qua luôn thằng này, lệnh nhập tiếp theo, sẽ bắt đầu sau delimiter này, vì vậy mà ở hình thứ 2, sau khi chạy xong getline, buffer rỗng (thằng '\n' đã bị bỏ qua) nên nó đọc được dòng tiếp theo.
Nguyễn Hoàng Trung viết 02:36 ngày 01/10/2018

em học chưa tới, cảm ơn anh đã khai sáng

Thành Lê viết 02:42 ngày 01/10/2018

anh giải thích kỹ giúp e tí , e đọc nảy h hơn chục lần mà hông hiểu gì hết T_T

Nguyễn Xuân Phúc viết 02:40 ngày 01/10/2018

Giống: cả 2 hàm đều ưu tiên đọc từ buffer trước rồi sau đó mới nhận dữ liệu từ input nếu cần.

  • get: khi đọc đến kí tự phân tách (delimiter) thì nó ngưng và kí tự phân tách này vẫn nằm trong buffer (tức là nó dừng NGAY TRƯỚC delimiter, và kí tự này sẽ được dùng trong lệnh đọc tiếp theo.
  • getline: khi đọc đến delimiter thì nó ngưng và kí tự phân tách bị loại bỏ, tức là nó không nằm trong string (vì dừng khi gặp nó nên không đọc nó vào) và cũng bị xóa khỏi buffer.

Hay một cách dễ hiểu là thằng get sẽ kiểm tra kí tự tiếp theo nếu không phải là delimiter thì mới lấy ra đưa vào string, còn thằng getline là lấy ra trước rồi mới kiểm tra.

Thành Lê viết 02:36 ngày 01/10/2018
  • get: khi gặp kí tự phân tách (delimiter), thì nó ngừng, và đưa delimiter này vào buffer chờ đọc tiếp (đó là lý do vì sao ở hình đầu, chắn chắn lệnh getline sẽ bị trôi, vì ghi getline nó ưu tiên trong buffer trước và buffer đang có dữ liệu nên nó sẽ đọc thằng ‘\n’ vào). - getline: khi gặp delimiter, nó sẽ ngừng, đồng thời bỏ qua luôn thằng này, lệnh nhập tiếp theo, sẽ bắt đầu sau delimiter này, vì vậy mà ở hình thứ 2, sau khi chạy xong getline, buffer rỗng (thằng ‘\n’ đã bị bỏ qua) nên nó đọc được dòng tiếp theo.

dạ anh ơi , em có test chương trình ở hình 1 khi em cin.get() thêm 1 lần nữa thì cái lệnh cin.getline() hết bị trôi mà anh nói là cin.get() nó đưa cái delimiter vào buffer
Vậy cin.get() thêm lần nữa chi , nó cũng đưa vào buffer tiếp vậy anh ? Em cảm ơn

Nguyễn Xuân Phúc viết 02:41 ngày 01/10/2018

Vì thằng get cũng như getline, đều ưu tiên đọc trong buffer. Vì vậy ở get thứ 2, buffer không rỗng, nên nó sẽ lấy dữ liệu trong đó ra để đọc và làm cho buffer rỗng. Nên lệnh getline tiếp theo sẽ đọc mới hoàn toàn (không bị trôi lệnh)
Nếu nhớ không nhầm là vậy :3

Bài liên quan
0