2016-08-11 24 views
5

Tôi mới dùng C++ và cảm thấy hơi bối rối với câu hỏi này. Tôi sử dụng Mac OS X và lệnh "g ++ -std = C++ 11" để biên dịch mã.Điều gì đã xảy ra khi nhấn ctrl + D trong khi (cin >> i) lặp trong C++?

Có thể câu hỏi này quá rộng, tôi không biết, nhưng nếu ai đó có thể giải thích bằng ví dụ sau, xin vui lòng?

int temp; 
while (cin >> temp) { 
    cout << temp << endl; 
} 

Khi tôi nhập

1 2 3<ENTER> 

It in

1 
2 
3 

như tôi mong đợi, và nhấn

<CTRL+D> 

để bỏ thuốc lá.

Nhưng nếu tôi đầu vào

1 2 3<CTRL+D> 

It in

1D 
2 

sau đây với ký tự đầu vào của tôi "3", và sau đó tôi nhấn

<ENTER> 

ký tự cuối cùng "3" sẽ được in. Sau đó, tôi nên bấm

<CTRL+D> 

lần nữa để thoát.

Và bên cạnh đó, có một ví dụ tương tự như sau:

vector<int> list; int temp; 
while (cin >> temp) { 
    list.push_back(temp); 
} 
for (auto e : list) { 
    cout << e << endl; 
} 

Khi tôi nhập

1 2 3<ENTER><CTRL+D> 

It in

1D 
2 
3 

Vì vậy, câu hỏi của tôi là:

Chuyện gì đã xảy ra e ba trường hợp sau đó tôi nhấn

<CTRL+D> 

<ENTER> 

?

Tại sao có ký tự "D" trong trường hợp thứ hai và thứ ba? Và làm thế nào để ngăn chặn nó xảy ra?

+1

Bạn có chắc chắn không nhấn đúng 'CTRL + D' và có thể bạn đã đẩy' D' quá? Hãy thử lại và xem liệu hành vi đó có được lặp lại không! –

+0

@BiagioFesta Điều này không thể đúng vì danh sách là số nguyên. Làm thế nào ông có thể đẩy "D"? –

+0

"D" không phải là ký tự mà chương trình của bạn in (không thể, nó chỉ in số). Đó là điều mà trình điều khiển thiết bị đầu cuối của bạn in. –

Trả lời

1

Có thể do chồng chéo giữa đầu ra của bảng điều khiển và của bạn.

Khi bạn nhấn ctrl+D, bảng điều khiển in ^D nhưng in ký tự trả lại ('\r') ngay sau đó. Điều này có nghĩa là mọi thứ sẽ được in sau đó sẽ được in trên ^D.

Chương trình đầu tiên của bạn in 1, vì vậy nó chỉ chồng chéo ^, để nguyên D. Hãy thử chèn một số có hai chữ số và bạn sẽ thấy rằng D biến mất.

Một số bàn điều khiển xóa dòng sau ký tự trả về, nhưng một số không giống như bảng điều khiển của bạn.

Solutions

(1) Bạn có thể dễ dàng in '\n' (std::endl) trước khi bạn bắt đầu in danh sách. Điều này sẽ để lại ^D xấu xí trong bảng điều khiển nhưng nó sẽ không chồng lên bản in của bạn.

vector<int> list; int temp; 
while (cin >> temp) { 
    list.push_back(temp); 
} 
cout << endl; // Print before the list. 
for (auto e : list) { 
    cout << e << endl; 
} 

(2) Bạn có thể in dòng trống trước để xóa bản in này. Chỉ cần in: " \r" (tức là hai dấu cách rồi ký tự trả về).

int temp; 
while (cin >> temp) { 
    cout << "\r \r" << temp << endl; // Print in each line 
} 
+0

Không có giải pháp nào hoạt động ngoại trừ trường hợp đặc biệt khi nhấn Ctrl-D ở dòng đầu tiên của đầu vào. –

+0

@ n.m. Tôi đã chỉnh sửa các giải pháp với mã rõ ràng để ngăn chặn sự hiểu lầm. –

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