[C++] Sử dụng cin.ignore đúng cách khi nhập chuỗi C++

Vấn đề khi nhập chuỗi bằng getline() in C++

  • Dòng lệnh getline() bị trôi không nhập được chuỗi: thực chất getline() vẫn thực hiện và đã kết thúc bởi nó đọc ở bộ đệm input và phát hiện các kí tự kết quả của một dòng ví dụ như kí tự “enter” sau khi nhập ở cin,… Nhiều người sử dụng giải pháp là dọn dẹp bộ đệm input bằng cin.ignore() ngay trước dòng getline(cin,…). Nhưng việc chọn giải pháp này phát sinh vấn đề khác được mô tả ngay dưới.
  • Việc dùng cin.ignore() ngay trước getline(cin,…) sẽ giải quyết được vấn đề getline() bị trôi nếu ngay trước getline(cin,.. có một lệnh để lại các kí tự kết thúc quá trình nhập như enter ví dụ như cin >> x. Nhưng giải pháp này lại phát sinh một vấn đề là nếu trước đó không có lệnh nào để lại kí tự trong bộ đêm input thì các kí tự đầu tiên của chuỗi nhập cho getline sẽ bị lấy mất ( ví dụ người dùng nhập “nguyen van a” và trước dòng nhập getline(cin,…)cin.ignore() thì kí tự n trong nguyen van a bị mất khi gán cho biến cần nhập ở getline(cin,…). Như vậy việc dùng cin.ignore() ngay trước getline(cin,…) chưa là giải pháp tốt bởi ta khó kiểm tra soát khối lệnh được thực hiện trước khi mình sử dụng getline()

Giải pháp

  • Vậy để sử xử lý nhập chuỗi bằng getline(cin,..) tốt nhất là xóa đi kí tự kết thúc quá trình nhập chuỗi bị thừa lại ở bộ đệm input ngay khi các lệnh để lại kí tự kết thúc chuỗi kết thúc (ví dụ, ngay khi không cần nhập bằng cin >> x nữa thì xóa kí tự thừa do nó để lại bằng cin.ignore())
  • Ví dụ:
....
cin >> x;
cin >> y;
cin.ignore();//lấy kí tự kết thúc ra khỏi bộ đệm input khi không cần cin >> z;
...
//các lệnh khác
...
//bắt đầu chỗ nhập getline() và không cần lo lắng ở đây nếu đã xử lý kĩ ở các khối lệnh trước đó
getline(cin,name);

Leave a Reply

Your email address will not be published. Required fields are marked *