2016-08-11 7 views
5

Я новичок в C++ и немного смущен этим вопросом. Я использую Mac OS X и команду «g ++ -std = C++ 11» для компиляции кода.Что произошло, когда нажмите ctrl + D во время (cin >> i) цикла на C++?

Возможно, этот вопрос слишком широк, я не знаю, но если кто-то может объяснить следующим примером, пожалуйста?

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

Когда вход

1 2 3<ENTER> 

Он печатает

1 
2 
3 

, как я ожидал, и нажмите

<CTRL+D> 

, чтобы бросить курить.

Но если вход

1 2 3<CTRL+D> 

Он печатает

1D 
2 

следующие с моей входной символ "3", а затем я нажимаю

<ENTER> 

последний символ "3" будут напечатаны. Затем я должен нажать

<CTRL+D> 

еще раз, чтобы бросить курить.

И кроме того, есть подобный пример следующим образом:

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

Когда вход

1 2 3<ENTER><CTRL+D> 

Он печатает

1D 
2 
3 

Так что мой вопрос:

Что произошло в е три случая, то я нажимаю

<CTRL+D> 

и

<ENTER> 

?

Почему во втором и третьем случаях присутствует символ «D»? И как предотвратить это?

+1

Вы точно не нажали кнопку 'CTRL + D' и, возможно, вы тоже нажали' D'? Повторите попытку и проверьте, повторяется ли поведение! –

+0

@BiagioFesta Это не может быть правдой, так как список имеет целые числа. Как он может нажать «D»? –

+0

«D» не является символом, который печатает ваша программа (он не может, он печатает только цифры). Это то, что печатает ваш драйвер терминала. –

ответ

1

Возможно, это связано с перекрытием между выходом консоли и вашим.

Когда вы нажимаете ctrl+D, консоль печатает ^D, но печатайте символ возврата ('\r') сразу после этого. Это означает, что все, что будет напечатано после этого, будет напечатано над ^D.

Ваша программа сначала печатает 1, поэтому она перекрывает только ^, оставляя D нетронутыми. Попробуйте ввести двухзначное число, и вы увидите, что D исчезает.

Некоторые консоли стирают линию после символа возврата, но некоторые из них не так, как, вероятно, ваша консоль.

Solutions

(1) Вы можете просто напечатать '\n' (std::endl), прежде чем приступить к печати списка. Это оставит уродливое ^D в консоли, но оно не будет перекрывать ваш отпечаток.

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) Сначала вы можете напечатать пустую строку, чтобы удалить эту печать. Просто напечатайте: " \r" (т. Е. Два пробела, а затем символ возврата).

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

Ни одно из решений не работает, кроме специального случая нажатия Ctrl-D в первой строке ввода. –

+0

@ н.м. Я редактировал решения с явным кодом, чтобы предотвратить недоразумение. –

 Смежные вопросы

  • Нет связанных вопросов^_^