image
Nguyên Nhân Và Cách Khắc Phục
Bạn thử chạy mã nguồn sau và sẽ thấy sau khi nhập số cho n và ấn enter thì chưa kịp nhập nội dung cho xâu s đã bị trôi qua câu lệnh đó
Nội dung của xâu s là rỗng
#include “iostream” #include “string” using namespace std; int main(){ int n; cout << “Nhap n : “; cin >> n; string s; cout << “Nhap xau s : “; getline(cin, s); cout << “So n da nhap : ” << n << endl; cout << “Xau s : ” << s << endl; return 0; }
Nguyên nhân :
Hàm getline() khi bạn nhập xâu s sẽ dừng nhập cho tới khi nó gặp được ký tự xuống dòng (enter), những ký tự nó đọc được từ luồng vào cin cho tới kí tự enter đó sẽ được gán cho string s.
Khi bạn nhập cin >> n sau đó ấn enter, thì giá trị mà bạn vừa nhập sẽ được gán cho n tuy nhiên ký tự enter ở cuối bạn nhập sẽ nằm trong luồng vào cin, khi hàm getline() đọc từ luồng cin thì sẽ gặp ký tự enter này do cin ở câu lệnh trên để lại.
Do getline() sẽ dừng nhập khi gặp enter nên nó sẽ dừng ngay tại lúc đó mà chưa hề nhập được ký tự nào và dẫn đến xâu s của bạn là một xâu rỗng
Vậy nếu trước hàm getline() mà trong luồng cin có thừa kí tự enter(thông thường do cin ở câu lệnh trước đó để lại) thì sẽ xảy ra trôi lệnh.
Lưu ý rằng nếu bạn dùng câu lệnh getline() sau một câu lệnh getline() thì bạn sẽ không bị trôi lệnh vì hàm getline() sẽ xử lý ký tự enter ở cuối dòng chứ không để lại trong luồng vào như câu lệnh cin.
Cách khắc phục :
Khi bạn biết nguyên nhân getline() bị trôi lệnh là do đọc phải ký tự enter thừa trong luồng vào từ bàn phím nên để xử lý việc này bạn chỉ cần loại bỏ được ký tự enter này trước khi dùng getline().
Bạn có thể dùng hàm cin.ignore(1) hoặc cin.ingore() để loại bỏ đi 1 ký tự trong luồng cin, khi đó ký tự enter sẽ bị loại bỏ và hàm getline() sẽ đợi bạn nhập nội dung sau đó ấn enter.
Ngoài ra bạn cũng có thể sử dụng hàm getchar() vì hàm này sẽ đọc 1 ký tự trong luồng cin và đọc được ký tự enter thừa.
Bây giờ bạn có thể chạy lại mã nguồn này và kiểm tra
#include “iostream” #include “string” using namespace std; int main(){ int n; cout << “Nhap n : “; cin >> n; string s; cout << “Nhap xau s : “; cin.ignore(); getline(cin, s); cout << “So n da nhap : ” << n << endl; cout << “Xau s : ” << s << endl; return 0; }
Video String :
AwBY3AkQO3M