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 для продолжения
$

★★

Последнее исправление: znavko (всего исправлений: 2)

Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от yoghurt

Очевидно же что лабу пишет. Да ещё и под венду.

a1batross ★★★★★
()

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

Sadler ★★★
()

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

annulen ★★★★★
()
Ответ на: комментарий от 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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.