LINUX.ORG.RU
решено ФорумTalks

Код C++ для Линукс. Ожидание нажатия клавиши Enter

 , ,


0

1

Около часа тред не мог быть решён, поэтому предлагаю отлаженный рабочий код для Linux, g++, libc. Наследовано http://www.cplusplus.com/forum/articles/7312/ с той лишь разницей, что надо чистить буфер ввода, чтобы нажатие enter считывалось снова, а не захватывалось из предыдущего ввода.

Небольшой helloworld, который здоровается с пользователем, запрашивая его имя и ожидая нажатия Enter для завершения.

Исправлено:

$ cat 1.cpp
#include <iostream>
#include <limits>
using namespace std;

int main(int argc, char** argv)
{
  string name;
  cout << "Программа Hello!" << endl;
  cout << "Введите Ваше имя и нажмите enter: "; 
  cin >> name;
  cout << "Hello, " << name << endl;
  char c[1];
  cout << "Нажмите Enter для продолжения ";
  //cin.clear();
  cin.ignore(numeric_limits<streamsize>::max(), '\n');
  cin.getline(c, 1);
  return 0;
}

$ g++ 1.cpp -o out
$ ./out
Программа Hello!
Введите Ваше имя и нажмите enter: znavko
Hello, znavko
Нажмите Enter для продолжения
$

★★

Чего оно тут делает? Это для тех, кто про getchar() не слышал вообще?

Bfgeshka ★★★★★ ()
Ответ на: комментарий от Bfgeshka

getchar() у меня не работала, выдавая ошибки видимости.

znavko ★★ ()
Ответ на: комментарий от znavko

этот код выходит без нажатия Enter, потому что хватает enter из уже введенной строки name

#include <stdio.h>
using namespace std;

int main(int argc, char** argv)
{
  string name;
  cout << "Программа Hello!" << endl;
  cout << "Введите Ваше имя и нажмите enter: "; 
  cin >> name;
  cout << "Hello, " << name << endl;
  char c;
  cout << "Нажмите Enter для продолжения, getchar() ";
  c = getchar();
  while (c!='\n') {
    c = getchar();
  } 
  return 0;
}

znavko ★★ ()
Ответ на: комментарий от znavko

а так работает

% cat 1.cpp       
#include <iostream>
#include <stdio.h>
#include <limits>
using namespace std;

int main(int argc, char** argv)
{
  string name;
  cout << "Программа Hello!" << endl;
  cout << "Введите Ваше имя и нажмите enter: "; 
  cin >> name;
  cout << "Hello, " << name << endl;
  char c;
  cout << "Нажмите Enter для продолжения, getchar() ";
  cin.clear();
  fflush(stdin);
  cin.ignore(numeric_limits<streamsize>::max(), '\n');
  c = getchar();
  while (c!='\n') {
    c = getchar();
  } 
  return 0;
}

тогда вопрос в том, как правильно сбросить кеш ввода и не перехватывать enter из предыдущего ввода. В данном примере - правильно?

znavko ★★ ()

Все смешалось - кони, люди...

Жать ентер для продолжения в благородных домах считается дурным тоном. Программа отработала, результат вывела, завершилась. Никаких ожиданий в конце не надо!

yoghurt ★★★★★ ()

Потратил час на flush stdin? Таких бы сильных программистов да товарняки разгружать.

Sadler ★★★ ()

Мешать в одну кучу iostream и stdin - не комильфо.

annulen ★★★★★ ()

.h

Спешу тебя огорчить, это не C++

buddhist ★★★★★ ()
Ответ на: комментарий от buddhist

Да хоть .zagolovok. В стандарте что-нибудь про это написано?

lberserq ()
Ответ на: комментарий от Sadler

При чем тут flush, который сбрасывает буферы? Он применим к stdout/stderr, а не к stdin

Nastishka ★★★★ ()
Ответ на: комментарий от Nastishka

хорошо. так:

#include <iostream>
#include <stdio.h>
#include <limits>
using namespace std;

int main(int argc, char** argv)
{
  string name;
  cout << "Программа Hello!" << endl;
  cout << "Введите Ваше имя и нажмите enter: "; 
  cin >> name;
  cout << "Hello, " << name << endl;
  char c;
  cout << "Нажмите Enter для продолжения, getchar() ";
 // cin.clear();
  cin.ignore(numeric_limits<streamsize>::max(), '\n');
  c = getchar();
  while (c!='\n') {
    c = getchar();
  } 
  return 0;
}

работает.

znavko ★★ ()
Ответ на: комментарий от lberserq

Нет, зато известно, что за использование сишных функций (особенно stdio.h вперемешку с крестовыми streams) в крестовой программе ТСа ждет собственный котел в аду.

Unicode4all ★★★★ ()
Ответ на: комментарий от Unicode4all

вот рабочий код с библиотеками iostrem и limits

лог консоли:

% cat 1.cpp
#include <iostream>
#include <limits>
using namespace std;

int main(int argc, char** argv)
{
  string name;
  cout << "Программа Hello!" << endl;
  cout << "Введите Ваше имя и нажмите enter: "; 
  cin >> name;
  cout << "Hello, " << name << endl;
  char c[1];
  cout << "Нажмите Enter для продолжения ";
  cin.ignore(numeric_limits<streamsize>::max(), '\n');
  cin.getline(c, 1);
  return 0;
}

% g++ 1.cpp
% ./a.out
Программа Hello!
Введите Ваше имя и нажмите enter: znavko
Hello, znavko
Нажмите Enter для продолжения 
%

работает! спасибо за справку.

znavko ★★ ()
Последнее исправление: znavko (всего исправлений: 1)
Ответ на: комментарий от yoghurt

Но ведь тогда окошко закроется, и я не успею увидеть результат работы программы!!1 /s

theNamelessOne ★★★★★ ()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)