2016-05-06 3 views
2

Извините, что я новичок в этом, поэтому ответ, вероятно, очевиден, но ... Может кто-нибудь объяснить мне, почему для моего кода, который принимает ввод, работает только когда я нажимаю enter, а затем вводим свое письмо для другого, если?Ввод работает только после нажатия клавиши ввода?

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

int main() 
{ 
    printf("Question?\nType Y for yes or N for no"); 

    if(getc(stdin) == 'N') 
     printf("That is not the correct answer\n"); 

    else if(getc(stdin) == 'Y') 
     printf("Good Job! That is the correct answer\n"); 

    else 
     printf("That's not a valid answer\n"); 

    return 0; 
} 

Что происходит, если я типа «N», то он правильно отвечает «Это не правильный ответ», но если я типа «Y» он говорит: «Это не является правильным ответом»; однако, если я нажимаю enter, а затем набираю «Y», он правильно отвечает «Хорошая работа! Это правильный ответ!». Это, вероятно, что-то очевидное, потому что снова я очень новичок в кодировании, но любая помощь приветствуется.

+0

Я удалил тег из вашего названия. В StackOverflow у нас есть ... ну, _tags_, которые делают точно то же самое и могут быть легко переданы компьютерами, а также помогают гарантировать, что каждый использует одни и те же имена для одних и тех же вещей. –

ответ

9

вы читаете два символа - один на ветке Y и один на ветви N. Попробуйте что-то вроде

int c; /* pop quiz: why int? */ 
c = getc(stdin); 
if (c == 'N') ... 

Update Это сказало, что вы по-прежнему будет необходимо ввести RETURN, чтобы получить символ. Но сейчас логика не является правильным. Как только вы получите правильную логику, посмотрите на «сырой» и «редкий» режим для драйвера терминала.

+0

Отсутствует адресация «Может кто-нибудь объяснить мне, почему для моего кода, который принимает ввод, работает только при нажатии клавиши ввода ...» – chux

+1

Спасибо! Это сработало :))) –

+0

@chux Hah, я добавил обновление перед вашим комментарием :-) –

6

Клеммы по умолчанию находятся в линейном режиме. Там нет гарантии, что терминал поддерживает все остальное. Язык C - это стандарт, который был разработан для работы с даже самыми простыми устройствами и не предполагает, что ваш терминал обладает сложными возможностями, такими как адресация курсора, стирание или контроль уровня персонажа.

Если вы хотите что-то интересное, вы покинете сферу чистого C и начнете использовать определенную информацию о характеристиках конкретного оборудования или наличия библиотек на своей платформе.

0

Ввод и вывод терминала по умолчанию является строковым буферизированным.

Вы можете поставить вход в режим одиночного символа (в отличие от режима линии), но этот метод отличается от каждой ОС - На Linux вы будете использовать ioctl вызовы перенастроить вход и вы измените vtime и vmin параметров сказать, что вам нужен один персонаж за раз. Также см. этот вопрос. termios VMIN VTIME and blocking/non-blocking read operations

Смежные вопросы