01/10/2018, 11:55
Khai báo một biến kiểu int mà sau đó nhập từ bàn phím ta lại nhập ký tự, thì biến đó nhận giá trị là gì?
Mọi người cho em hỏi: Trong C++ mình khai báo một biến kiểu int mà sau đó nhập từ bàn phím ta lại nhập ký tự, thì biến đó nhận giá trị là gì?
Em có đoạn code dưới này, khi chạy mà nhập vào ký tự nó sẽ lặp vô tận. Ai giải thích giúp em với ?
https://pastebin.com/L6jCZzzM
Bài liên quan
Theo minh nhớ là máy sẽ nhận mã ASCII của kí tự đó.
Bài code của b là lặp câu thông báo khi giá trị của n == 0 và… mình không hiểu sao lại như vây nên chắc phải đợi các coder cao tay ấn vào giúp vậy ^^
Thực ra thì máy sẽ không nhận ASCII của ký tự đó đâu. Còn tại sao nó lặp vô tận thì đến nay mình cũng chưa biết
Tại sao cái ông viết C++ không cho cin quăng exception mà lại để lỗi iostream nhỉ?
Mình có nghe cô giảng một lần :)) chắc chắn là máy sẽ chuyển từ chữ sang số nhưng lại không nhớ nó là ASCII hay 01 :))
Điều kiện của vòng lặp là 0 nên theo đúng logic chắc là các giá trị của n khi là chữ thì bằng 0?? nếu muốn rõ hơn chắc chủ topic phải thêm 1 lệch dừng ct như lệnh getch()
Chắc v :))
getch() không được thì phải. Trước có thử xoá buffer các kiểu nó vẫn cứ chạy vèo vèo, toàn phải Ctrl C để dừng
Thế thì đành phải công nhận biến mà n nhận khi không phải số là 0 rồi :))
kiểm tra lỗi theo kiểu check
cin.good()
hoặc checkif (!cin)
tức là đọc vào bị lỗi thì xử lý:muốn sợ người dùng input hơn 100 ký tự, ignore ko sạch thì xài
cin.ignore(numeric_limits<streamsize>::max(), '\n')
, (include thêm header<limits>
)Vẫn chưa hiểu lí do vì sao nó lặp. Khi test mà khai báo int, rồi nhập ký tự vào thì kết quả đưa ra là 0.
http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt
C++11 thì nó gán 0 cho n nếu đọc lỗi, còn trước C++11 thì nó ko gán gì vô n cả.
int n;
chỉ khai báo ko gán giá trị trước thì ko biết n chứa giá trị gì, muốn cho chắc ăn thì gán giá trị cho n khi khai báo luôn:int n = 0;
nếu đọc lỗi thì cin được set failbit, ko đọc được nữa, nên
cin >> n
ko làm gì cả (nếu cin ko bị gán failbit thì nó mới dừng console lấy input, còn bị gán failbit thì cin >> n nó bỏ qua luôn ko dừng console), n vẫn chứa giá trị rác nên checkn == 0
trả về false nên nó lặp vô tận, phải gọicin.clear()
. Nhưng cũng chưa đủ, vì khi đọc lỗi cin nó ko bỏ qua các ký tự lỗi mà để y nguyên, nên phải bỏ qua mấy ký tự lỗi đó nữa bằng cách gọicin.ignore(100, '\n')
mình chạy thử code của bạn thì nó ra một giá trị rác
Giá trị mặc định thôi tức là không nhận.