Lí do màn hình Console không dừng lại cho bạn nhập dữ liệu là vì dữ liệu bạn nhập vào trước đó đã bị mắc kẹt lại trong bộ nhớ tạm, do đó câu lệnh cin.getline(name, 30)
sẽ lấy luôn dữ liệu từ bộ nhớ tạm để truyền vào biến name
, và nó nghĩ rằng: à! nó đã nhận được dữ liệu rồi, không cần phải dừng màn hình Console lại làm gì nữa.
Tại sao vấn đề này lại xảy ra, phân tích đoạn mã nguồn của bạn là có thể thấy rõ, tại dòng:
cout<<"\n\tid: "; cin>>id;
là dòng nhập dữ liệu đầu tiên cho biến id
, lúc này bộ nhớ tạm không có gì hết, do đó nó sẽ dừng lại cho bạn nhập, đó là lí do bạn có thể nhập thành công ở dòng cin
đầu tiên.
Dựa vào kết quả màn hình Console, mình thấy bạn đã nhập vào số 2
sau đó nhấn Enter
, thì lúc này trong bộ nhớ tạm sẽ lưu lại giá trị là 2\n
, 2
là giá trị bạn đã nhập, vậy \n
ở đâu ra? Chính là giá trị được lưu vào khi bạn nhấn phím Enter
để xuống dòng. Tiếp tục, cin
sẽ lấy giá trị 2
trong bộ nhớ tạm để lưu vào biến id
, vậy lúc này trong bộ nhớ tạm vẫn còn tồn tại ký tự \n
.
Qua câu lệnh nhập thứ 2, vấn đề sẽ bị xảy ra, tại dòng:
cout<<"\n\tname: "; cin.getline(name, 30);
cin.getline
sẽ vào bộ nhớ tạm để lấy dữ liệu bạn nhập, lúc này nó thấy bộ nhớ tạm đang chứa giá trị \n
, do đó nó sẽ lấy luôn thằng \n
để lưu vào biến name
và chuyển qua câu lệnh tiếp theo, kết quả là nó sẽ không dừng lại cho bạn nhập input nữa.
Để khắc phục vấn đề này thì các cách có thể là xóa bộ nhớ tạm trước khi qua câu lệnh cin.getline
hoặc dùng cin.ignore
để bỏ qua kí tự \n
trong bộ nhớ tạm.
cout<<"\n\tid: ";
cin>>id;
cin.ignore();
cout<<"\n\tname: ";
cin.getline(name, 30);
Mọi thứ sẽ hoạt động bình thường, đọc thêm bạn có thể thấy người ta dùng cin.ingore(100, '\n')
tức là bỏ qua 100 ký tự tiếp theo trong bộ nhớ tạm hoặc bỏ qua tất cả ký tự cho đến khi nó gặp ký tự \n
, tùy vào chương trình của bạn cần bỏ qua bao nhiêu ký tự mà dùng cho phù hợp.
Em cũng bị như thế và nó không cho nhập tên còn tự lấy tên là
– Member4772 Member4772 09.07.2019m
chứ không phải lànull
nữa.