C: Завершение программы нажатием клавиши - PullRequest
5 голосов
/ 26 октября 2009

В C я обычно использую функцию getch(), чтобы дождаться нажатия клавиши и затем завершить программу, но недавно я прочитал, что, поскольку это не стандартная функция, ее использование является плохой практикой программирования.

Итак, вместо следующего:

int main() {
    dosomething();
    getch(); //wait for the user to see the results and press a key to end
    return 0;
}

Что я должен сделать, чтобы заменить getch?

Ответы [ 9 ]

8 голосов
/ 26 октября 2009

getc(stdin); в этом смысле портативен

4 голосов
/ 26 октября 2009

Использование нестандартной функции ввода / вывода - неплохая практика per se ; это становится проблемой, если вы собираетесь портировать этот код на другую платформу, которая не поддерживает getch().

Проблема в том, что есть нет стандартных библиотечных функций, которые обнаруживают отдельные нажатия клавиш (getchar() и fgetc() буферизируются и требуют, чтобы вы нажали Enter, чтобы они вернулись); вам придется использовать что-то нестандартное, чтобы сделать это. Если вы намерены запустить этот код только на этой конкретной платформе, используйте getch(), если это то, что вам нужно, и просто помните, что это решение не обязательно будет применяться к другим платформам. Если вы собираетесь портировать этот код на платформы, которые не поддерживают getch(), изолируйте системный вызов за функцией-оболочкой, чтобы при переносе кода изменялся только код внутри функции-оболочки.

int getKeystroke(void)
{
  /**
   * Put platform-specific call here
   */
  return getch();
}

int main(void)
{
  ... // do stuff here
  getKeystroke();
  return 0;
}
2 голосов
/ 26 октября 2009

Вы можете исправить окно терминала, чтобы оно не исчезло.

1 голос
/ 26 октября 2009

Я думаю, что использование getch () является наиболее распространенным способом предотвращения закрытия окна консоли, но в C ++ наиболее опытные программисты рекомендуют использовать cin.get

 std::cin.get();

вместо:

getch();
1 голос
/ 26 октября 2009

Я предпочитаю запуск программы из командной строки.

1 голос
/ 26 октября 2009

getchar() является стандартным, но из-за буферизации строки вам все равно нужно будет нажать Enter, прежде чем getchar вернется.

0 голосов
/ 26 октября 2009

Просто пытаясь ответить на что-то другое, вы можете использовать

while(1) sleep(10);

в конце основной функции (до return 0;) и затем вы можете нажать ctrl-c, чтобы завершить программу. Я думаю, что вы не должны сталкиваться с проблемой переносимости, и я надеюсь, что это не плохая практика программирования:)

0 голосов
/ 26 октября 2009

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

system("pause");
0 голосов
/ 26 октября 2009

Вы используете компилятор Turbo C? getch() широко используется там.

OTOH, если вы хотите, чтобы программа ждала, запустите двоичный файл внутри оболочки / терминала / приглашения. Перейдите в этот каталог и вызовите

Windows

C:> executable.exe

Linux:

~$ ./exec

Вы можете использовать getchar(), единственная проблема в том, что он буферизован. getch() не буферизуется. Вы также можете сделать getchar() небуферизованным, но код для этого не стоит. Я попробовал это однажды, но из-за его сложной сложности никогда не удосужился попробовать это снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...