читать символ из консоли - PullRequest
       19

читать символ из консоли

9 голосов
/ 13 января 2012

Я пишу консольное приложение, которое выполняет несколько scanf для int И после этого я выполняю getchar:

int x,y;
char c;
printf("x:\n");
scanf("%d",&x);
printf("y:\n");
scanf("%d",&y);
c = getchar();

в результате этого я получаю c = '\n', несмотря на то, что ввод:

1
2
a

Как решить эту проблему?

Ответы [ 5 ]

12 голосов
/ 13 января 2012

Это потому, что scanf оставляет новую строку, которую вы вводите во входном потоке. Попробуйте

do
    c = getchar();
while (isspace(c));

вместо

c = getchar();
2 голосов
/ 24 июня 2014

Вы можете использовать функцию fflush, чтобы очистить все, что осталось в буфере, как последовательность предыдущих вводов строки команды:

fflush(stdin);
2 голосов
/ 10 июля 2013

Способ очистить любое пространство перед желаемым символом и просто игнорировать оставшиеся символы -

do {
    c = getchar();
} while (isspace(opcao));
while (getchar() != '\n');
1 голос
/ 13 января 2012

Вызовите fflush(stdin); после scanf, чтобы удалить все ненужные символы (например, \ r \ n) из входного буфера, оставленные scanf.

Редактировать: Как отметили ребята в комментариях fflush решение может иметь проблему переносимости, поэтому вот мое второе предложение. Ни в коем случае не используйте scanf и выполняйте эту работу, используя комбинацию fgets и sscanf. Это гораздо более безопасный и простой подход, потому что позволяет обрабатывать неправильные ситуации ввода.

int x,y;
char c;
char buffer[80];

printf("x:\n");
if (NULL == fgets(buffer, 80, stdin) || 1 != sscanf(buffer, "%d", &x))
{
    printf("wrong input");
}
printf("y:\n");
if (NULL == fgets(buffer, 80, stdin) || 1 != sscanf(buffer, "%d", &y))
{
    printf("wrong input");
}
c = getchar();
1 голос
/ 13 января 2012

Для начала scanf должно читаться как scanf("%d\n", &x); или y. Это должно сработать.

man scanf

...