1
Hàm cin.getline() không dừng màn hình để nhập input trong C++?
0
Cộng đồng đã đăng:

Mọi người cho em hỏi sao em cũng dùng hàm cin.getline(name, 30) nhưng mà nó không cho em nhập mà nó bỏ qua hàng ấy luôn ạ?

Mã nguồn:

Không thể nhập dữ liệu trong cin getline

Kết quả:

Màn hình Console không thể nhập dữ liệu

Em cũng bị như thế và nó không cho nhập tên còn tự lấy tên là m chứ không phải là null nữa.

Member4772 09.07.2019
thêm bình luận...
0
xuans2huy510 đã đăng:

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.

đã bổ sung 4.8 năm trước bởi
xuans2huy510

Còn vấn đề tại sao bạn chưa nhập vào được giá trị cho biến name mà lúc nó lại print ra màn hình Console là chữ m mà không phải là null thì mình không chắc, mình để ý có thấy bạn sử dụng cấu trúc List để lưu dữ liệu và mã nguồn bạn post lên chưa đầy đủ nên mình không thể nói gì về giá trị m này.

xuans2huy 09.07.2019
thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)