2016-01-05 14 views
5

Tôi đang làm việc thông qua trình Bjarne Stroustrup của - Nguyên tắc và Thực hành Sử dụng C++ và đến ví dụ sau:cin trong C++ cố gắng gán giá trị chuỗi cho một biến int?

#include "std_lib_facilities.h" 

int main() { 
    /* Name and Age input */ 
    cout << "Please enter your first name and age\n"; 
    string first_name = "???"; 
    int age = -1.0; 
    cin >> first_name >> age; 
    cout << "Hello," << first_name << "(age " << (age * 12) << " months)\n"; 
    return 0; 
} 

Nếu bạn chạy chương trình và đầu vào Carlos 22, nó sẽ chính xác sản lượng Hello, Carlos (age 22). Tuy nhiên, nếu bạn đặt trong 22 Carlos, ông nói rằng đầu ra phải là Hello, 22 (age -1) vì kể từ khi "Carlos không phải là một số nguyên ... nó sẽ không được đọc". Tuy nhiên, khi tôi chạy nó, nó trả về Hello, 22 (age 0) mà có vẻ như nó gán một giá trị rác cho nó. Tôi tò mò là tại sao điều này xảy ra, vì cuốn sách ngụ ý rằng trừ khi bạn nhập một số nguyên, nó sẽ không cố gắng gán bất cứ điều gì cho biến số age. Tôi đã chạy mã với các điểm ngắt và xác nhận giá trị của age thay đổi từ -1 đến 0 sau khi nhập đầu vào không phải số nguyên.

Tôi có làm gì sai không? Hay đây là một sự kỳ quặc do thực tế tôi đang xây dựng nó thông qua Xcode và bất cứ trình biên dịch nào đi kèm với điều đó?

+0

Đây là 'hành vi chưa xác định' mà bạn đang nhận được. Trong trường hợp như vậy, đầu ra có thể là bất cứ điều gì –

+4

C++ 11 trở đi sẽ đặt các loại vô hướng thành 0 khi trích xuất không thành công, trước khi C++ 11 giá trị không được chạm. – user657267

+0

@ user657267, Ah, cảm ơn vì điều đó. Tôi đã nhầm lẫn vì nó là phiên bản cập nhật của cuốn sách cho C++ 11, nhưng sau khi đọc bình luận của bạn, tôi nhìn lên errata và chắc chắn đủ, có một lưu ý về điều này. Cảm ơn! – Dan

Trả lời

4

Nếu bạn làm theo các dấu vết của các cuộc gọi từ các cuộc gọi

cin >> age; 

bạn kết thúc với một cuộc gọi đến std::strtol. Giá trị trả về của strtol là:

  • Nếu không chuyển đổi có thể được thực hiện, 0 được trả về.

Kiểm tra trạng thái cin sau khi các cuộc gọi để đảm bảo rằng tất cả các trích xuất thành công.

cin >> first_name >> age; 
if (cin) 
{ 
    // Extraction was successful. 
    // Use the data. 
} 
else 
{ 
    // Extraction was not successful. 
    // Deal with the error. 
} 
+1

Ah, điều đó có ý nghĩa. Tôi chỉ nhìn lên các errata cho cuốn sách và thấy điều này: "Đây không phải là thực sự là một errata, nhưng một số thực hiện không ra một int khi >> không thành công. Cuối cùng tất cả sẽ, nhưng cho đến khi C + + 11 không ai làm. bạn nhận được 0 hoặc -1 tùy thuộc vào cổ điển của việc triển khai của bạn. " Vì vậy, như bạn đã chỉ ra, nó thực hiện các tiêu chuẩn như nó cần. Cảm ơn! – Dan

+1

@Dan, thật không may là sách, ngay cả bởi cha của ngôn ngữ, trở nên lỗi thời không quá lâu. –

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