2009-03-10 66 views
5

Tôi nhận thấy rằng bất cứ khi nào tôi viết chương trình sử dụng std::cin nếu tôi muốn người dùng nhấn Enter để kết thúc chương trình, tôi phải viết std::cin.ignore() hai lần để có được hành vi mong muốn. Ví dụ:Tại sao cần phải có cin.ignore() thứ hai?

#include <iostream> 

int main(void) 
{ 
    int val = 0; 
    std::cout << "Enter an integer: "; 
    std::cin >> val; 

    std::cout << "Please press Enter to continue..." << std::endl; 

    std::cin.ignore(); 
    std::cin.ignore(); // Why is this one needed? 
} 

Tôi cũng đã nhận thấy rằng khi tôi không sử dụng cin cho đầu vào thực tế mà chỉ cho ignore() cuộc gọi cuối cùng, tôi chỉ cần một.

+0

bạn đang chạy Linux hoặc Windows, nó có thể là do vấn đề CRLF nếu bạn chạy các cửa sổ ... – Ben

+0

Cùng "vấn đề" xảy ra trên Solaris. Nó không liên quan gì đến CRLF. –

Trả lời

8

Discl: Tôi đang đơn giản hóa những gì thực sự xảy ra.

Dịch vụ đầu tiên dọn dẹp những gì toán tử trích xuất (>>) không tiêu thụ. Lần chờ thứ hai cho \ n khác.

Nó là giống hệt nhau khi chúng ta làm một std :: getline sau khai thác: a the_stream::ignore(std::numeric_limits<streamsize>::max(), '\n'); là cần thiết trước khi cuộc gọi để std :: getline()

+3

Tôi hiểu rồi. Vì vậy, nếu các ký tự bạn nhập vào dấu nhắc đầu tiên là "123 \ n", bạn đang nói rằng toán tử >>() rời khỏi "\ n" một mình, và dấu phẩy đầu tiên() đọc nó; sau đó bỏ qua 2() chờ bạn bấm một phím và đọc nó (số 2 "\ n"). +1. –

+0

Đó là ý tưởng. –

0

Điều đó thật kỳ lạ. Bạn đang chạy trên nền tảng nào? Theo định nghĩa, ignore chiết xuất và loại bỏ n ký tự từ luồng đầu vào hoặc nếu nó chạm EOF thì nó dừng lại. Nếu bạn không chỉ định bất kỳ tham số nào, nó sẽ trích xuất 1 ký tự. Trên Windows, dòng kết thúc liên quan đến cả một số \r\n - tổng cộng hai ký tự (một dấu xuống dòng sau một dòng mới).

+0

Tôi nghĩ rằng lúc đầu cũng vậy, nhưng thư viện được cho là trừu tượng bất kỳ kế hoạch kết thúc dòng nền tảng nào sử dụng và mã ứng dụng của bạn sẽ chỉ thấy "\ n". –

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