Следующее решение относится только к платформе Microsoft Windows, поскольку вопрос был помечен как "windows". Решение также может работать на других платформах, но это не гарантируется, поскольку оно использует функции, которые не являются частью официального стандарта ISO C.
Вы можете использовать функцию _kbhit
, чтобы определить, была ли нажата клавиша. Если эта функция возвращает ненулевое значение, указывающее, что нажатие клавиши ожидает во входном буфере, вы можете вызвать функцию _getch
или _getche
без риска блокировки функции. Затем вы можете сравнить возвращенный символ с символом возврата '\b'
, чтобы определить, была ли нажата клавиша возврата.
Однако в вашем случае использование этих функций для проверки нажатия клавиши возврата не будет работать вместе с scanf
по двум причинам:
- Согласно этой странице из официальной документации Microsoft , функции консольного ввода-вывода не совместимы с функциями потокового ввода-вывода (* 1021) *,
scanf
, et c.) - Функциональный вызов
scanf
заблокирует весь поток в ожидании ввода пользователем целого числа и нажмите ENTER .
Поэтому было бы лучше прочитать каждый символ один за другим с консоли с помощью _getche
, проверить, является ли это символом возврата, и, если нет, записать его в свой собственный входной буфер. После того, как пользователь нажмет ENTER , вы можете преобразовать содержимое буфера в число, используя strtol
, atoi
или sscanf
.
Я изменил ваш код на следующий: sh this:
#include <stdlib.h>
#include <conio.h>
int main()
{
const int MAX_INPUT = 80;
char input_buffer[MAX_INPUT + 1];
char c;
int i;
int x;
_cputs( "hello\n" );
_cputs( "hi\n" );
f1();
//this finite loop prevents a buffer overrun
for ( i = 0; i < MAX_INPUT; i++ )
{
c = _getche();
//when using console I/O functions, we must check
//for carriage return '\r' instead of newline '\n'
if ( c == '\r' ) break;
if ( c == '\b' ) return 0;
input_buffer[i] = c;
}
input_buffer[i] = '\0';
//we must print a newline '\n' after encountering a
//carriage return '\r', because _getche does not echo it
_cprintf( "\n" );
// NOTE:
// Using the function strtol instead of atoi allows you
// to check if an error occured while converting.
x = atoi( input_buffer );
f2();
_cprintf( "%d", x );
return 0;
}
Поскольку, как уже упоминалось, функции ввода-вывода консоли не совместимы с потоком I Функции ввода / вывода, я также заменил функции puts
и printf
версиями консоли _cputs
и _cprintf
.
Обратите внимание, что этот код не будет компилироваться, потому что, как и ваш исходный код, он содержит два вызова функций для необъявленных функций. Однако, если вы удалите эти два вызова функций, мой опубликованный код скомпилируется и будет работать правильно (по крайней мере, в моей системе).