2010-08-27 41 views
5

Ok, do đó, tôi có một số vấn đề với C++ iostreams mà cảm thấy rất kỳ quặc, nhưng nó có thể được xác định hành vi, xem xét điều này xảy ra với cả hai MSVC++ và G + +.Tại sao lỗi tràn số nguyên gây ra lỗi với C++ iostream?

Nói rằng tôi có chương trình này:

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a; 
    cin >> a; 
    cout << a << endl; 
    cin >> a; 
    cout << a << endl; 

    return 0; 
} 

Nếu tôi cố tình tràn bằng cách cho người đầu tiên cin một giá trị có nghĩa là lớn hơn giới hạn tối đa của một int, tất cả các cuộc gọi hơn nữa để cin.operator>>() sẽ ngay lập tức quay trở lại vì một lý do và a được đặt thành một số giá trị. Giá trị có vẻ không xác định.

Tại sao và hành vi này được ghi lại ở đâu? Có cách nào để tìm ra nếu một tràn như vậy xảy ra?

Ngoài ra, chương trình tương tự này có vẻ hoạt động như tôi dự định. Nếu tôi tràn giá trị, nó sẽ cung cấp cho a một số giá trị và tiếp tục như thể tràn không bao giờ xảy ra.

#include <cstdio> 
using namespace std; 

int main() 
{ 
    int a; 
    scanf("%d", &a); 
    printf("%d\n", a); 
    scanf("%d", &a); 
    printf("%d\n", a); 
    scanf("%d", &a); 
    printf("%d\n", a); 

    return 0; 
} 

Trả lời

7

iostreams được thiết kế để phát hiện lỗi và nhập một trạng thái lỗi. Bạn nhận được kết quả tương tự từ tràn số nguyên như khi nhập một chuỗi không phải là số.

Truyền cin (hoặc bất kỳ luồng nào) tới bool hoặc kiểm tra cin.rdstate() để xác định xem có lỗi hay không.

Gọi cin.clear()cin.ignore() để xóa lỗi. Nó sẽ nhận tại điểm của các nhân vật thất bại.

Đối với tài liệu chính thức, Chuẩn không may bị một chút khó hiểu trong ruột của iostream. Xem §27.6.1.2.1, 27.6.1.2.2 và 22.2.2.1.1/11 (không đùa):

- Chuỗi ký tự được tích lũy trong giai đoạn 2 sẽ khiến cho scanf báo cáo đầu vào thất bại. ios_base :: failbit được gán cho err.

documentation for scanf chỉ là không thể hiểu được và tôi sẽ tin tưởng rằng lỗi tràn được cho là lỗi.

1

Tôi nghĩ rằng cin đang tự đặt trạng thái lỗi do đọc không hợp lệ.

Câu trả lời đầu tiên ở đây giải thích nó.

http://www.dreamincode.net/forums/topic/93200-cin-checking-and-resetting-error-state/

Chỉ cần cố gắng mã này và nó dường như được thiết lập để thất bại nhà nước

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a; 
    cin >> a; 
    if(!cin) 
    { 
     cin.clear(); 
    } 
    cout << a << endl; 
    cin >> a; 
    if(!cin) 
    { 
     cin.clear(); 
    } 
    cout << a << endl; 

    return 0; 
} 
0

a bắt đầu với giá trị không xác định. Nó không phải lỗi của cin. Hãy thử:

if (cin >> a) { 
    cout << a endl; 
} 

Nó sẽ kiểm tra xem đọc vào a thành công trước khi sử dụng a

Các vấn đề liên quan