01/10/2018, 17:13

Cin.ignore() không hoạt động?

Chào mọi người!

Em có code đoạn code dưới đây để sử dụng cin.ignore() loại hết ký tự nhập thừa trong stdin ra để cin cho nhập ký tự mới, nhưng lại không hoạt động ạ: (fflush thì vẫn hoạt động đc)

Code: https://ideone.com/yxE7Pn

#include <iostream>
#include <cstdint>
 
using namespace std;
 
int main()
{
    char ch;
    cout << "Type a character: ";
    cin >> ch;
    cout << "ASCII code: " << static_cast<int16_t>(ch) << endl;
    if (!cin.eof())
        cout << "There are some characters more in stdin file object
";
    char next_ch;
    cin.ignore(INT64_MAX, '
');
    //fflush(stdin);
    cin >> next_ch;
    cout << "The next character: " << next_ch << endl;
 
    return 0;
}

Cho em hỏi lỗi ở đâu mà cin vẫn nhận ký tự thừa trong stdin dù có cin.ignore() ạ?

viết 19:19 ngày 01/10/2018

thử in std::cout << sizeof(std::streamsize) xem nó ra 4 hay 8? Nếu là 4 thì ko thể truyền vào INT64_MAX được

xài std::numeric_limits<std::streamsize>::max() trong <limits> thay cho INT64_MAX trong <cstdint>

cin.ignore nhận 2 giá trị, kiểu của giá trị thứ nhất là std::streamsize chứ ko phải là int64_t. Tùy vào trình biên dịch mà std::streamsize có thể có 32 bit hoặc 64 bit. Nếu là 32 bit thì INT64_MAX có giá trị là 0xffffffffffffffff, bị chuyển về int 32 bit nó chỉ lấy 32 bit thấp nhất => 0xffffffff = -1. cin.ignore(INT64_MAX, '\n') khi này đồng nghĩa với cin.ignore(-1, '\n') nên nó chả ignore ký tự nào cả vì 0 > -1 rồi. Phải xài numeric_limits<streamsize>::max() thì nó mới tự động lấy đúng max của std::streamsize

Secret viết 19:14 ngày 01/10/2018

Vậy là trong trường hợp trên, streamsize là 32bit đúng ko ạ?

viết 19:22 ngày 01/10/2018

em tự cout cái sizeof(streamsize) ra coi là biết.

Bài liên quan
0